Где / Когда / Как BindingList <T>конвертирует / связывает PropertyChanged с событием ListChanged - PullRequest
3 голосов
/ 20 июля 2009

У меня есть иерархия объектов, которые все реализуют INotifyPropertyChanged. У меня также есть пользовательский список, производный от BindingList.

Насколько я понимаю, когда я добавляю объект, который реализует INotifyPropertyChanged в список, событие PropertyChanged каким-то образом автоматически подключается / преобразуется в событие ListChanged.

Однако после того, как я установил свой список как источник данных моего DataGridView, когда я изменяю значение в сетке, событие ListChanged не запускается ... Когда я вхожу в код, оказывается, что PropertyChanged () событие не запускается, потому что оно пустое, что, как я предполагаю, означает, что оно не подключается / не преобразуется в событие ListChanged BindingList, как это должно быть ...

Например:

public class Foo : INotifyPropertyChanged
{
     //Properties...
     private string _bar = string.Empty;
     public string Bar
     {
         get { return this._bar; }
         set
         {
              if (this._bar != value)
              {
                  this._bar = value;
                  this.NotifyPropertyChanged("Bar");
              }
         }
     }

     //Constructor(s)...
     public Foo(object seed)
     {
         this._bar = (string)object;
     }

     //PropertyChanged event handling...
     public event PropertyChangedEventHandler PropertyChanged;
     protected void NotifyPropertyChanged(String info)
     {
         if (this.PropertyChanged != null)
         {
             this.PropertyChanged(this, new PropertyChangedEventArgs(info));
         }
     }
}

А вот и мой список пользовательских классов ...

public class FooBarList : BindingList<Foo>
{
     public FooBarList(object[] seed)
     {
          for (int i = 0; i < seed.Length; i++)
          {
             this.Items.Add(new Foo(this._seed[i]));
          }
     }
}

Есть идеи или предложения?

Спасибо!

Josh

1 Ответ

2 голосов
/ 20 июля 2009

Я думаю, проблема в том, что вы звоните this.Items.Add() вместо this.Add(). Свойство Items возвращает базовый List<T>, у которого метод Add() не обладает нужной вам функциональностью.

...