2

嗨,我尝试了几种方法,但要么不成功,要么不理想。我只是想捕捉集合中任何项目的 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);
    }
    ...
}

然后我可以轻松地附加到集合的 MyPropertyChanged 事件,它运行良好但更优雅的任何人?

提前致谢

4

1 回答 1

3

您几乎正在做您需要做的事情,AFIK 没有更好的方法可以做到这一点。

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

于 2011-04-26T21:37:00.787 回答