Почему не вызывается мой обработчик событий CollectionChanged? - PullRequest
1 голос
/ 02 апреля 2012

Я провел некоторые исследования, и другие ответы на stackoverflow указывают, что мне нужно расширить класс ObservableCollection, чтобы добавить обработчики событий PropertyChanged к каждому элементу, когда элемент добавляется или удаляется, чтобы получить события, когда содержимое элемента визменение коллекции ... действительно немного раздражает, но я реализовал этот класс на основе некоторых из этих ответов:

    public class DeeplyObservableCollection<T> : ObservableCollection<T>
where T : INotifyPropertyChanged
{
    public DeeplyObservableCollection()
        : base()
    {
        CollectionChanged += new NotifyCollectionChangedEventHandler(DeeplyObservableCollection_CollectionChanged);
    }

    void DeeplyObservableCollection_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
    {
        if (e.NewItems != null)
        {
            foreach (Object item in e.NewItems)
            {
                (item as INotifyPropertyChanged).PropertyChanged += new PropertyChangedEventHandler(item_PropertyChanged);
            }
        }
        if (e.OldItems != null)
        {
            foreach (Object item in e.OldItems)
            {
                (item as INotifyPropertyChanged).PropertyChanged -= new PropertyChangedEventHandler(item_PropertyChanged);
            }
        }

    }

    void item_PropertyChanged(object sender, PropertyChangedEventArgs e)
    {
        NotifyCollectionChangedEventArgs a = new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset);
        OnCollectionChanged(a);
    }
}

Насколько я понимаю, событие CollectionChanged будет запущено, когда когда-либо один из элементовзапускает событие PropertyChanged.Кажется, это работает, когда я шагаю по коду, когда я попадаю в метод DeeplyObservableCollection_CollectionChanged из метода item_PropertyChanged.

Так что в моем коде я присоединяю обработчик события к методу DeeplyObservableCollection_CollectionChanged, например так:

GroupSettingsList.CollectionChanged += new NotifyCollectionChangedEventHandler(this.ContentCollectionChanged);

GroupSettingsList - это DeeplyObservableCollection, а ContentCollectionChanged - это обработчик событий CollectionChanged.Я не получаю никаких ошибок, но мой метод никогда не вызывается, и я не уверен, почему.

Что мне нужно сделать, чтобы мой обработчик событий вызывался здесь?

ДополнительноКод, показывающий, как я использую этот класс:

    class MyViewModel : ViewModelBase
{

    private DeeplyObservableCollection<GroupSettings> _groupSettingsList;

    public MyViewModel()
    {
    GroupSettingsList = new DeeplyObservableCollection<GroupSettings>();

    GroupSettingsList.CollectionChanged += new NotifyCollectionChangedEventHandler(this.ContentCollectionChanged);

    // Have also tried this:
    // _groupSettingsList.CollectionChanged += new NotifyCollectionChangedEventHandler(this.ContentCollectionChanged);
}

public class GroupSettings : INotifyPropertyChanged
{
    private bool _isDisplayed;

    public bool IsDisplayed
    {
        get { return _isDisplayed; }
        set
        {
            _isDisplayed = value;
            this.OnPropertyChanged("IsDisplayed");
        }
    }

    public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;

    protected virtual void OnPropertyChanged(String propertyName)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs(propertyName));
        }
    }
}

public DeeplyObservableCollection<GroupSettings> GroupSettingsList
{
    get { return _groupSettingsList; }
    set
    {
        _groupSettingsList = value;


          this.OnPropertyChanged("GroupSettingsList");
        }
    }

    private void ContentCollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
    {
        DoSomething(); // This never executes.
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...