What should I do to make the WPF DataGrid display changes in its ObservableCollection's items when they are changed in code?
<DataGrid HorizontalAlignment="Left" Height="100" Margin="54,25,0,0" VerticalAlignment="Top" Width="264"
IsSynchronizedWithCurrentItem="True" AutoGenerateColumns="False"
ItemsSource="{Binding DataSource}" SelectedItem="{Binding SelectedPerson}">
<DataGrid.Columns>
<DataGridTextColumn Binding="{Binding FirstName}" />
<DataGridTextColumn Binding="{Binding LastName}" />
</DataGrid.Columns>
</DataGrid>
I update SelectedPerson.FirstName
in code and the setter of DataSource
executes. The current DataSource.FirstName
has been updated but the DataGrid does not display the change. If I click on a column header the DataGrid refreshes and shows the changed data. How can I make it refresh promptly when I am using MVVM and I don't have a reference to the DataGrid?
public class Person
{
public string FirstName { get; set; }
public string LastName { get; set; }
}
public class VM : Notifier
{
private ObservableCollection<Person> dataSource;
public ObservableCollection<Person> DataSource
{
get { return dataSource; }
set
{
dataSource = value;
OnPropertyChanged("DataSource");
}
}
private Person selectedPerson;
public Person SelectedPerson
{
get { return selectedPerson; }
set
{
selectedPerson = value;
OnPropertyChanged("SelectedPerson");
}
}
private string string1;
public string String1
{
get { return string1; }
set
{
string1 = value;
OnPropertyChanged(String1);
}
}
public VM()
{
String1 = "abc";
DataSource = new ObservableCollection<Person>();
DataSource.Add(new Person { FirstName = "Alpha", LastName = "Apple" });
DataSource.Add(new Person { FirstName = "Beta", LastName = "Banana" });
DataSource.Add(new Person { FirstName = "Charlie", LastName = "Cucumber" });
}
public ICommand SetSelectedCommand => new RelayCommandBase(SetSelected);
private void SetSelected(object parameter = null)
{
SelectedPerson.FirstName = String1;
SelectedPerson = SelectedPerson; // force setter to run
DataSource = DataSource; // force ObservableCollection setter to run
}
}