3

私はすべてがINotifyPropertyChangedを実装するオブジェクトの階層を持っています。 BindingListから派生したカスタムリストもあります。Where/When/How BindingList <T>はPropertyChangedをListChangedイベントに変換します。

INotifyPropertyChangedをimpelementsするオブジェクトをリストに追加すると、何とかPropertyChangedイベントが自動的にListChangedイベントにワイヤーアップ/変換されることは理解できます。

DataGridViewのデータソースとしてリストを設定した後、グリッドの値を変更すると、ListChangedイベントは発生しません。コードにステップインすると、PropertyChanged(それは私がすることになってそのように、するBindingListのListChangedイベントに変換し、それが取得されていないことを、有線アップ/意味すると想定され、nullでbecaue)イベントは、例えば

...トリガされていません。

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()メソッドが呼び出されて真が返されるまでのように見えます... –

+0

BindingList のPropertyChangedハンドラList .IndexOf()は、(間接的に)IEquatable .Equals()の実装を呼び出します。この動作を妨げる方法はないので、パフォーマンスについて懸念しているが、BindingList を絶対に使用する必要がある場合は、IComparer を実装する別のクラスに比較ロジックを抽出することを検討することもできます。 –

+0

OK ...私は具体的にIEquatableの実装をオーバーライドすることは重要ではなかったので、代わりにジェネリックベースに抽象メソッドを作成しました:public abstract bool EqualTo(T obj);これは私の問題を解決しました... もう一度ありがとう! –

関連する問題