3

我有一個對象的層次結構都實現INotifyPropertyChanged。我也有一個派生自BindingList的自定義列表。什麼地方/何時/如何BindingList <T>轉換/ wireup PropertyChanged ListChanged事件

這是我的理解,當我添加一個對象的推理INotifyPropertyChanged到列表,以某種方式PropertyChanged事件自動地連線/轉換爲ListChanged事件。

但是,我將我的列表設置爲我的DataGridView的數據源後,當我更改網格中的值時,ListChanged事件不會觸發......當我進入代碼時,事實證明PropertyChanged )事件不會觸發becaue爲null,我假設意味着它是沒有得到有線升/轉換成的BindingList的ListChanged事件,像它應該...

例如:

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])); 
      } 
    } 
} 

任何想法或建議?

謝謝!

喬希

回答

2

我認爲問題是,你打電話this.Items.Add()代替this.Add()。該Items財產返回基地List<T>,其Add()方法不具有所需的功能。

+0

感謝本......似乎在做伎倆...... 另一個說明,你知道關於BindingList 使用對象的Equals()方法來確定哪個列表項已經改變? 我問,因爲我的自定義對象都有自定義實現的IEquatable,並且它看起來像每當PropertyChanged事件觸發時,每個對象的Equals()方法被調用,直到其中一個返回true ... – 2009-07-20 20:48:54

+0

BindingList 的PropertyChanged處理程序使用列表 .IndexOf(),它(間接)調用您的IEquatable的實現 .Equals()。沒有辦法阻止這種行爲,所以如果你關心性能但絕對必須使用BindingList ,你可能會考慮將你的比較邏輯提取到一個獨立的類中,實現IComparer - 如果這在你的場景中完全可行。 – 2009-07-20 21:09:00

+0

好的......這並不重要,我專門重寫了IEquatable實現,所以我在我的泛型基礎中創建了一個抽象方法:public abstract bool EqualTo(T obj);這解決了我的問題... 再次感謝! – 2009-07-21 18:26:23

相關問題