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はこれをするより良い方法はありません。

1つは、アイテムがコレクションから削除されたときにイベントハンドラーを削除するコードを追加して、良き市民になり、メモリリークを回避することです。

于 2011-04-26T21:37:00.787 に答える