私がプロパティを持っている場合:
public list<String> names { get; set; }
名前がリストに追加されるたびに、「onNamesChanged」と呼ばれる引数用のカスタムイベントを生成して処理するにはどうすればよいですか?
私がプロパティを持っている場合:
public list<String> names { get; set; }
名前がリストに追加されるたびに、「onNamesChanged」と呼ばれる引数用のカスタムイベントを生成して処理するにはどうすればよいですか?
BindingList は、組み込みの変更追跡と、使用できるさまざまな既存のイベントを備えているため、おそらく最適なオプションです。以下は、BindingList イベントに転送される Add のカスタム イベントを公開する例です。
class Example
{
private BindingList<string> m_names = new BindingList<string>();
public IEnumerable<string> Names { get { return m_names; } }
public event AddingNewEventHandler NamesAdded
{
add { m_names.AddingNew += value; }
remove { m_names.AddingNew -= value; }
}
public void Add(string name)
{
m_names.Add(name);
}
}
System.ComponentModel.BindingList、特にListChangedイベントを確認する必要があります。
BindingList の代替手段の 1 つはObservableCollectionです。この場合、独自のイベント ハンドラーをCollectionChangedイベントにサブスクライブし、アクションに応じてイベントを発生させます。
DavidMohundroは1つのアプローチを示しています。もう1つのオプションは、Collection <T>から継承し、さまざまなメソッドをオーバーライドすることです。
class Foo {}
class FooCollection : Collection<Foo>
{
protected override void InsertItem(int index, Foo item)
{
// your code...
base.InsertItem(index, item);
}
protected override void SetItem(int index, Foo item)
{
// your code...
base.SetItem(index, item);
}
// etc
}
最後に、最初の原則から独自のリスト(IList、IList <T>)を作成できます。多くの作業が必要ですが、メリットはほとんどありません。
非正統的なアプローチは、PostSharp などの AOP フレームワークを使用して、イベントを発生させるアクセサーが呼び出される前/後にハンドラーを「織り込む」ことです。
プロパティがアクセスされたときの事前および/または事後処理コードを含む外部クラスを作成し、事前と事後の間でプロパティの値が変更されたかどうかを確認し、イベントを発生させます。
(ハンドラー コード内で) 比較のために値を取得している間、無限ループ (プロパティ アクセサーを呼び出し、AOP ハンドラーを呼び出し、アクセサーを呼び出すなど) に入る可能性があることに注意してください。このプロパティを含むクラスに反映して、バッキング フィールドを取得します。