可能重复:
ObservableCollection that also monitors changes on the elements in collection
我在WPF中有一个应用程序,但我想将(全部或部分)转换为MVVM。
我创建了一个viewmodel,它指向一些ObservableCollections显示在列表视图中(一次一个,可以用单选按钮更改)。
当集合被更改时,我会收到通知,但是当集合中的某个项目发生更改时(即IsSelected从false / true更改,反之亦然),我不会收到通知。
我可以看到让它工作的唯一方法是订阅每个项目的notifypropertychanged事件处理程序,并在进行新的选择以删除订阅并订阅另一个集合的事件时,但这似乎在至少不是最理想的解决方案。
什么解决方案适合这个问题?我检查了一些类似的帖子,但它们似乎有点不同。
答案 0 :(得分:1)
ObservableCollection
只监听集合本身的变化。它不负责收听对集合中的项目所做的更改。如果你想要这种行为,你必须自己添加它。
通常我会在CollectionChanged
事件中添加一些内容,这会将PropertyChanged
个事件添加/删除到集合中的项目。
void MyCollection_CollectionChanged(object sender, CollectionChangedEventArgs e)
{
if (e.NewItems != null)
{
for each (SomeObject item in e.NewItems)
item.PropertyChanged += SomeObject_PropertyChanged;
}
if (e.OldItems != null)
{
for each (SomeObject item in e.OldItems)
item.PropertyChanged -= SomeObject_PropertyChanged;
}
}
void SomeObject_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
// Handle event however you want here
// For example, simply raise property change to refresh collection
RaisePropertyChanged("MyCollection");
// Or move item to new collection if it's selected
if (e.Property == "IsSelected")
{
var item = object as SomeItem;
MyCollectionA.Remove(item);
MyCollectionB.Add(item);
}
}