I have a simple demo application which shows a list and edit box shows the selected property. If I change the property in edit boxes, the list gets updated. But if I modify the same in code (cmmand handler) it doesn't get updated. Why is that?
<StackPanel>
<ListView Margin="10" Name="myListView" ItemsSource="{Binding Persons}" SelectedItem="{Binding SelectedPerson, Mode=TwoWay}">
<ListView.View>
<GridView>
<GridViewColumn Header="First Name" Width="200" DisplayMemberBinding="{Binding FirstName}" />
<GridViewColumn Header="Last Name" Width="200" DisplayMemberBinding="{Binding LastName}" />
</GridView>
</ListView.View>
</ListView>
<TextBox Text="{Binding SelectedPerson.FirstName, UpdateSourceTrigger=PropertyChanged}"/>
<Button Content="Update" Command="{Binding CmdUpdate}"/>
</StackPanel>
My ViewModel class is here
class SimpleListViewModel : Notifier
{
private ObservableCollection<Person> _persons;
public ObservableCollection<Person> Persons
{
get
{
return _persons;
}
set
{
_persons = value; //
OnPropertyChanged("Persons");
}
}
private Person _selectedPerson;
public Person SelectedPerson
{
get { return _selectedPerson; }
set
{
_selectedPerson = value;
OnPropertyChanged("SelectedPerson");
}
}
public RelayCommand CmdUpdate { get; private set; }
public SimpleListViewModel()
{
var albert = new Person() { FirstName = "Albert", LastName = "Einstein" };
var bruno = new Person() { FirstName = "Bruno", LastName = "Latour" };
var charles = new Person() { FirstName = "Charles", LastName = "Darwin" };
var newton = new Person() { FirstName = "Isaac", LastName = "Newton" };
var hawking = new Person() { FirstName = "Stephen", LastName = "Hawking" };
_persons = new ObservableCollection<Person>() { albert, bruno, charles, newton, hawking };
CmdUpdate = new RelayCommand(OnCmdUpdate, IsCmdUpdateEnabled);
}
private bool IsCmdUpdateEnabled(object obj)
{
return true;
}
private void OnCmdUpdate(object obj)
{
//MessageBox.Show(SelectedPerson.FirstName);
SelectedPerson.FirstName += " CHANGED"; // listview NOT getting updated
}
};