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]));
}
}
}
任何想法或建議?
謝謝!
喬希
感謝本......似乎在做伎倆...... 另一個說明,你知道關於BindingList使用對象的Equals()方法來確定哪個列表項已經改變? 我問,因爲我的自定義對象都有自定義實現的IEquatable,並且它看起來像每當PropertyChanged事件觸發時,每個對象的Equals()方法被調用,直到其中一個返回true ... –
2009-07-20 20:48:54
BindingList的PropertyChanged處理程序使用列表 .IndexOf(),它(間接)調用您的IEquatable的實現 .Equals()。沒有辦法阻止這種行爲,所以如果你關心性能但絕對必須使用BindingList ,你可能會考慮將你的比較邏輯提取到一個獨立的類中,實現IComparer - 如果這在你的場景中完全可行。 –
2009-07-20 21:09:00
好的......這並不重要,我專門重寫了IEquatable實現,所以我在我的泛型基礎中創建了一個抽象方法:public abstract bool EqualTo(T obj);這解決了我的問題... 再次感謝! – 2009-07-21 18:26:23