有谁知道为什么这段代码不起作用:
public class CollectionViewModel : ViewModelBase { public ObservableCollection<EntityViewModel> ContentList { get { return _contentList; } set { _contentList = value; RaisePropertyChanged("ContentList"); //I want to be notified here when something changes..? //debugger doesn't stop here when IsRowChecked is toggled } } } public class EntityViewModel : ViewModelBase { private bool _isRowChecked; public bool IsRowChecked { get { return _isRowChecked; } set { _isRowChecked = value; RaisePropertyChanged("IsRowChecked"); } } }
ViewModelBase包含RaisePropertyChanged等的所有内容,并且它适用于除此问题之外的所有其他内容..
ViewModelBase
RaisePropertyChanged
当您更改集合内的值时,不会调用 ContentList 的 Set 方法,而是应该注意CollectionChanged事件的触发。
public class CollectionViewModel : ViewModelBase { public ObservableCollection<EntityViewModel> ContentList { get { return _contentList; } } public CollectionViewModel() { _contentList = new ObservableCollection<EntityViewModel>(); _contentList.CollectionChanged += ContentCollectionChanged; } public void ContentCollectionChanged(object sender, NotifyCollectionChangedEventArgs e) { //This will get called when the collection is changed } }
好的,这是我今天两次被 MSDN 文档错误所困扰。在我给你的链接中,它说:
在添加、删除、更改、移动项目或刷新整个列表时发生。
但它实际上 不会 在更改项目时触发。我想你需要一个更暴力的方法:
public class CollectionViewModel : ViewModelBase { public ObservableCollection<EntityViewModel> ContentList { get { return _contentList; } } public CollectionViewModel() { _contentList = new ObservableCollection<EntityViewModel>(); _contentList.CollectionChanged += ContentCollectionChanged; } public void ContentCollectionChanged(object sender, NotifyCollectionChangedEventArgs e) { if (e.Action == NotifyCollectionChangedAction.Remove) { foreach(EntityViewModel item in e.OldItems) { //Removed items item.PropertyChanged -= EntityViewModelPropertyChanged; } } else if (e.Action == NotifyCollectionChangedAction.Add) { foreach(EntityViewModel item in e.NewItems) { //Added items item.PropertyChanged += EntityViewModelPropertyChanged; } } } public void EntityViewModelPropertyChanged(object sender, PropertyChangedEventArgs e) { //This will get called when the property of an object inside the collection changes } }
如果你需要这个很多,你可能想要子类化你自己的子类ObservableCollection,CollectionChanged当成员PropertyChanged自动触发其事件时触发事件(就像它在文档中所说的那样......)
ObservableCollection
CollectionChanged
PropertyChanged