如何在嵌套元素发生变化时通知ObservableCollection<Book>
并且我需要知道它?
“ObservableCollection<Book>
”和“Book
”可能会有“Chapter
”成员。并且“Chapter”有一个名为“Name
”的字符串属性,我更改了名称值。
当Name->Chapter -> Book -> ObservableCollection<Book>
中的属性“名称”发生变化时,如何抛出ObservableCollection的CollectionChanged?
MVVM中的常用方法是通过manuell将其隧道化,以便在触发PropertyChange时触发CollectionChanged吗?
谢谢:)
更新:我在这篇文章中找到了一个解决方案:ObservableCollection not noticing when Item in it changes (even with INotifyPropertyChanged)
- &GT;使用帖子中的绑定列表或者TrulyObservableCollection的种类 bescause ObservableCollection不会像i那样转发项目通知 已经提到了! difference between ObservableCollection and BindingList
- &GT;如果你使用BindingList记住这篇文章的缺点 http://www.themissingdocs.net/wordpress/?p=465
答案 0 :(得分:0)
我过去也遇到过类似的问题。这是由于我使用嵌套属性和我没有通知传播。
每次我的对象改变时,我通过订阅PropertyChanged事件来解决它。这样我可以在更新嵌套属性时更新我的集合。
确保每个简单类型(例如,您的Name
属性)实现OnPropertyChanged,然后每个复杂类型(例如您的Book
和Chapter
属性)实现Notification Propagation。
您的Observable Collection应相应更新。
示例:
private Book _book;
public Book Book
{
get
{
return _book;
}
set
{
if (value == _book|| value == null)
return;
if (_book!= null)
_book.PropertyChanged -= BookPropertyChanged;
_book= value;
_book.PropertyChanged += BookPropertyChanged;
UpdateProperties();
}
}
更新方法:
private void BookPropertyChanged(object sender, PropertyChangedEventArgs args)
{
OnPropertyChanged(string.Empty);
}
public void UpdateProperties()
{
OnPropertyChanged(string.Empty);
}
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = "")
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}