Изменения свойств элемента WPF Catch ObservableCollection - PullRequest
2 голосов
/ 27 апреля 2011

Привет, я пробовал несколько способов сделать это, но либо не удался, либо не был идеаленЯ просто хочу поймать событие 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 коллекции, и оно работает хорошо, но кого-нибудь более элегантного?

Заранее спасибо

1 Ответ

3 голосов
/ 27 апреля 2011

вы в значительной степени делаете то, что вам нужно, AFIK, лучшего способа сделать это не существует.

Во-первых, вы можете добавить код для удаления вашего обработчика событий, когда элемент удаляется из коллекции, чтобы быть хорошим гражданином и избежать утечек памяти.

...