当 WPF DataGrid 在其 ObservableCollection 的项目中更改代码时,我应该怎么做?
<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>
我更新
SelectedPerson.FirstName
在代码和 DataSource
的 setter 中执行。当前DataSource.FirstName
已更新,但 DataGrid 不显示更改。如果我单击列标题,DataGrid 会刷新并显示更改的数据。当我使用 MVVM 并且我没有对 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
}
}
最佳答案
Person
类应该实现 INotifyPropertyChanged界面:
public class Person : INotifyPropertyChanged
{
private string _firstName;
public string FirstName
{
get { return _firstName; }
set
{
_firstName = value;
NotifyPropertyChanged();
}
}
private string _lastName;
public string LastName
{
get { return _lastName; }
set
{
_lastName = value;
NotifyPropertyChanged();
}
}
public event PropertyChangedEventHandler PropertyChanged;
private void NotifyPropertyChanged([CallerMemberName] String propertyName = "")
{
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
关于WPF DataGrid 在代码中更新其 ItemsSource 时不更新 UI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48344395/