WPF渔获物可观测收集';s项属性更改

WPF渔获物可观测收集';s项属性更改,wpf,events,try-catch,observablecollection,propertychanged,Wpf,Events,Try Catch,Observablecollection,Propertychanged,嗨,我试过几种方法,但不是不成功就是不理想。我只是想 捕获集合中任何项的PropertyChanged事件。我现在已经手动接通了 但我想知道是否有更优雅的解决方案: public class Item : INotifyPropertyChanged { ... public delegate void MyPropertyChangedHandler(object sender, PropertyChangedEventArgs e); public event MyP

嗨,我试过几种方法,但不是不成功就是不理想。我只是想 捕获集合中任何项的PropertyChanged事件。我现在已经手动接通了 但我想知道是否有更优雅的解决方案:

public class Item : INotifyPropertyChanged
{
    ...
    public delegate void MyPropertyChangedHandler(object sender, PropertyChangedEventArgs e);
    public event MyPropertyChangedHandler MyPropertyChanged;

    public event PropertyChangedEventHandler PropertyChanged = delegate { };
    private void OnPropertyChanged(string propertyName)
    {
        PropertyChangedEventArgs args = new PropertyChangedEventArgs(propertyName);
        PropertyChanged(this, args);
        if (MyPropertyChanged != null) MyPropertyChanged(this, args);
    }
    ...
}

public class ItemCollection : ObservableCollection<Item>
{
    ...
    public delegate void MyPropertyChangedHandler(object sender, PropertyChangedEventArgs e);
    public event MyPropertyChangedHandler MyPropertyChanged;

    protected override void OnCollectionChanged(NotifyCollectionChangedEventArgs e)
    {
        if (e.Action == NotifyCollectionChangedAction.Add)
        {
            foreach (Item item in e.NewItems)
            {
                item.MyPropertyChanged += new Item.MyPropertyChangedHandler(item_MyPropertyChanged);
            }
        }

        base.OnCollectionChanged(e);
    }

    void item_MyPropertyChanged(object sender, PropertyChangedEventArgs e)
    {
        MyPropertyChanged(sender, e);
    }
    ...
}
公共类项:INotifyPropertyChanged
{
...
公共委托void MyPropertyChangedHandler(对象发送者,PropertyChangedEventArgs e);
公共事件MyPropertyChangedHandler MyPropertyChanged;
公共事件PropertyChangedEventHandler PropertyChanged=委托{};
私有void OnPropertyChanged(字符串propertyName)
{
PropertyChangedEventArgs args=新的PropertyChangedEventArgs(propertyName);
财产变更(本,args);
如果(MyPropertyChanged!=null)MyPropertyChanged(this,args);
}
...
}
公共类ItemCollection:ObservableCollection
{
...
公共委托void MyPropertyChangedHandler(对象发送者,PropertyChangedEventArgs e);
公共事件MyPropertyChangedHandler MyPropertyChanged;
CollectionChanged上的受保护覆盖无效(NotifyCollectionChangedEventArgs e)
{
if(e.Action==NotifyCollectionChangedAction.Add)
{
foreach(e.NewItems中的项目)
{
item.MyPropertyChanged+=新item.MyPropertyChangedHandler(item\u MyPropertyChanged);
}
}
基础。变更的集合(e);
}
无效项\u MyPropertyChanged(对象发送方,PropertyChangedEventArgs e)
{
MyPropertyChanged(发件人,e);
}
...
}
然后我可以很容易地连接到该系列的MyPropertyChanged事件,它工作得很好,但更优雅


提前感谢

您正在做您需要做的事情,如果没有更好的方法可以做到这一点的话

有一件事,您可能希望添加代码,以便在从集合中删除项目时删除事件处理程序,从而成为一个好公民并避免内存泄漏