我的视图模型中有一个WPF工具包DataGrid
绑定到ObservableCollection
Car
。 Car
有一个PropertyChanged
事件,其两个字符串属性中的每一个的setter都会触发事件。我还将网格的SelectedItem
属性绑定到类型为Car
的视图模型中的属性,也称为SelectedItem
。
在与网格相同的窗口中,我有add
,modify
和delete
的按钮。 Add
和modify
打开一个包含两个文本框的对话框窗口,每个文本框对应一个Car
属性。 Delete
只显示一个确认对话框然后执行删除。
对于add
和delete
,我会添加或删除ObservableCollection
中的项目,并且网格会按预期自行更新。但是,对于modify
,它没有。首先,我的Car
没有使用PropertyChanged
,经过一些搜索,我发现当单个项目的属性发生变化时,网格需要更新。但是现在我正在使用PropertyChanged
,网格仍然没有更新。
我尝试在视图模型中更改SelectedItem
的值,并直接更改集合中的项目。
我做错了什么?
答案 0 :(得分:1)
确保您正在实施INotifyPropertyChanged,而不仅仅是提升PropertyChanged事件。此外,在提升PropertyChanged时,您必须将“this”作为发件人传递,否则WPF将忽略该事件。
下面是一个实现INotifyPropertyChanged的简单基类。
public class Person : INotifyPropertyChanged {
private string name;
public string Name {
get { return name; }
set {
if (name != value) {
name = value;
OnPropertyChanged("Name");
}
}
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged(string propertyName) {
var handler = PropertyChanged;
if (handler != null) {
handler(this, new PropertyChangedEventArgs(propertyName));
}
}
}
答案 1 :(得分:0)
听起来像是ObservableCollection的经典问题。 ObservableCollection仅通知其自身的添加,删除等。它不会通知您存储在其中的任何属性的更改。这就是您的添加/删除操作按预期工作的原因。
你应该做的是使用CollectionView并绑定到:
ObservableCollection<MyObject> myCollection = new ObservableCollection<MyObject>();
ICollectionView view = CollectionViewSource.GetDefaultView(myCollection);
使用此方法还具有在视图中内置分组和排序的优点。