嵌套属性更改时抛出ObservableCollection的CollectionChanged

时间:2018-03-27 17:01:35

标签: c# mvvm nested observablecollection

如何在嵌套元素发生变化时通知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

1 个答案:

答案 0 :(得分:0)

我过去也遇到过类似的问题。这是由于我使用嵌套属性和我没有通知传播。

每次我的对象改变时,我通过订阅PropertyChanged事件来解决它。这样我可以在更新嵌套属性时更新我的​​集合。

确保每个简单类型(例如,您的Name属性)实现OnPropertyChanged,然后每个复杂类型(例如您的BookChapter属性)实现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));
    }