的ObservableCollection PropertyChanged事件(Observable

2019-07-28 19:35发布

行,所以我想继承ObservableCollection的属性添加到它。 不幸的是, PropertyChanged事件受到保护。 基本上我要继承它有一个SelectedItem ,我可以绑定到我的MVVM WPF应用程序列表。

这里是我的类的骨架:

public class SelectableList<T> : ObservableCollection<T>
{
    public T SelectedItem {get;set;}
}

但我不能做到以下几点:

SelectableList<int> intList = new SelectableList<int>();
intList.PropertyChanged += new PropertyChangedEventHandler(intList_Changed);

因为访问限制。 这使我问一个更深层次的问题。 怎么来的UI可以得到通知PropertyChanged事件(如Count属性),我不能做到这一点的代码隐藏?

我的头在旋转,有人可以告诉我吗?

Answer 1:

SelectableList<int> intList = new SelectableList<int>();
((INotifyPropertyChanged)intList).PropertyChanged += 
    new PropertyChangedEventHandler(intList_Changed);

的ObservableCollection 器具明确INotifyPropertyChanged的 ,这意味着你必须实例强制转换为接口,才能访问接口的方法,属性和事件。 至于为什么这样做,我不知道。 该Binding标记extensio n不“知道” ObservableCollections或任何其他类型。 它检查类型,看看他们是否实现或扩展特定的接口/基类(INPC,INCC,DependencyObject的,等等),所以如果接口显式实现并不关心。



Answer 2:

的ObservableCollection(INT .NET 3.5)出现在一个实现PropertyChanged事件有趣的方式 。

protected event PropertyChangedEventHandler PropertyChanged;

event PropertyChangedEventHandler INotifyPropertyChanged.PropertyChanged;

这意味着保护的PropertyChanged事件很可能只是为了用于内部实施。 另INotifyPropertyChanged.PropertyChanged事件是实际满足INotifyPropertyChanged接口的实现作为一个显式接口 。 奇怪的是我没有看到,其中INotifyPropertyChanged.PropertyChanged实际上是提高了的ObservableCollection内的任何地方。 这可能预示着这是.NET 3.5中的一个错误,虽然我还没有测试,以确认是否例如属性更改事件引发的,当一个项目被添加到一个集合,但它似乎是它是如何工作的计数。

在.NET 4.0中实现它看来,INotifyPropertyChanged.PropertyChanged事件挂钩,而不是由保护PropertyChanged事件可能是一个bug修复使用相同的私人代表。 也可能这只是由于汽车事件的实现是如何在.NET 4.0中处理分歧 。

更正:我已经验证INotifyPropertyChanged.PropertyChanged事件是由的ObservableCollection提出让我做以上基于使用反射来看看的ObservableCollection实现必须是不准确的结果的假设。 我的猜测是,反射器是做一些奇怪的错误我没有这方面的证据,但。

所以,让你的例子来工作,你需要写这个工作看起来像下面就像威尔已经证明了他的答案的例子。

SelectableList<int> intList = new SelectableList<int>();
((INotifyPropertyChanged)intList).PropertyChanged += 
    new PropertyChangedEventHandler(intList_Changed);

有意思吧? 使用显式接口主要是用来避免在一个给定的接口所需成员不可避免的冲突,但它们可以被用来在一定意义上隐藏成员的存在。

如果你想提高性能变化事件,你在你的子类的外观引入覆盖和/或调用保护OnPropertyChanged方法的ObservableCollection也实现了自己的自定义属性。 这种技术是一个很好采用的标准,并允许子类引发事件或处理事件,而无需访问底层事件委托。 通常,优选通过的方式,而不是过多使用具有子钩事件处理程序,以它自己的基类事件的这种技术。 更多的例子来看看如何在各个控件的事件在WinForms和WPF的贯彻落实。



Answer 3:

我尝试添加一个新的财产

public class ResultCollection<T> : ObservableCollection<T>
{

        Boolean _val;
        public Boolean Val
        {   
            get
            {   
                return _val;
            }
            set
            {   
                _val= value;
                OnPropertyChanged(new PropertyChangedEventArgs("Val"));
            }
        }
}

我还真没注意到,当受保护 的PropertyChanged定义。 终于感动瓦尔属性视图模型。



Answer 4:

该UI能够而且确实得到通知。 这仅仅是与的ObservableCollection,为保护其定义PropertyChanged事件的限制。

FWIW,我想你最好只留下的ObservableCollection,只是增加另一个属性到你的虚拟机。



文章来源: ObservableCollection PropertyChanged event