另一类财产中的可观察收集

时间:2014-08-07 17:23:32

标签: c# wpf observablecollection inotifypropertychanged

假设我有一个实现INotifyPropertyChanged的类,其中一个属性是一个成员为ObservableCollections的类:

namespace Example
{
    public class A : INotifyPropertyChanged
    {
        private B _prop;
        public B Prop 
        {
            get { return _prop; }
            set 
            {
                _prop = value;
                NotifyPropertyChanged("Prop");
            }
        }

        public A() { Prop = new B(); }

        //"Some Property" related Prop.words

    }

    public class B 
    {
        public ObservableCollection<String> words { get; set; }

        public B() { words = new ObservableCollection<String>(); }
    }

}

我很困惑,当A更改时,如何通知课程Prop.words中的该属性。我在哪个类中实现INotifyCollectionChanged的处理程序?

编辑:我之前没有指定上下文,但我在&#34;某些属性&#34;上绑定了一个WPF控件。我需要在Prop.words更改时更新。

2 个答案:

答案 0 :(得分:2)

如果需要通知A类,那么您必须 仅在A类 中挂钩CollectionChanged。在Prop。的属性设定器中执行此操作。

确保取消处理程序,以防属性B被设置为新值以避免任何内存泄漏。

public class A : INotifyPropertyChanged
{
    private B _prop;
    public B Prop
    {
        get { return _prop; }
        set
        {
            if(_prop != null)
                _prop.words.CollectionChanged -= words_CollectionChanged;
            _prop = value;
            if (_prop != null)
                _prop.words.CollectionChanged += words_CollectionChanged;
            NotifyPropertyChanged("Prop");
        }
    }

    void words_CollectionChanged(object sender, 
                                 NotifyCollectionChangedEventArgs e)
    {
        // Notify other properties here.
    }

    public A() { Prop = new B(); }

    //Some Property related Prop.words

}

答案 1 :(得分:0)

A类的客户端应该处理这个问题。

当基础馆藏发生变化时,恕我直言会提出PropertyChanged会破坏INotifyPropertyChanged功能合约

此外想象你有一个项目控件绑定到集合:每次集合更改它将完全反弹,因为我们通知它已完全改变,绝对不是你想要的!

A a = new A();
...
a.Prop.Words.CollectionChanged += ...

如果绑定到Prop属性,这正是WPF控件的作用。

请注意,从教条的OO设计角度来看,这违反了得墨忒耳法则,所以你可以将Words集合表面变成你的A类型以避免这种情况,但这是另一个问题/辩论。