问题描述
没有人知道为什么会这样code不工作:
does anyone know why this code doesn't work:
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"); }
}
}
PS:ViewModelBase containts家居RaisePropertyChanged等,它的工作一切,除了这个问题..
PS: ViewModelBase containts everything for RaisePropertyChanged etc. and it's working for everything else except this problem..
推荐答案
当您更改集合中的一个值。ContentList的设置方法不会被调用,而不是你应该寻找出的的事件触发。
The ContentList's Set method will not get called when you change a value inside the collection, instead you should be looking out for the CollectionChanged event firing.
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文档犯错的两倍。在链接我给你这样说的:
Okay, that's twice today I've been bitten by the MSDN documentation being wrong. In the link I gave you it says:
时发生一个项目中添加,删除,
改变,移动,或整个列表
刷新。
但它实际上的当一个项目改变不的火灾。我猜你需要再一个更暴力破解的方法:
But it actually doesn't fire when an item is changed. I guess you'll need a more bruteforce method then:
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
事件(像它说,它应该在文档中......)
If you are going to need this a lot you may want to subclass your own ObservableCollection
that triggers the CollectionChanged
event when a member triggers its PropertyChanged
event automatically (like it says it should in the documentation...)
这篇关于的ObservableCollection没有注意到,当它改变项(即使有INotifyPropertyChanged的)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!