C#カスタムイベントハンドラー
-
03-07-2019 - |
質問
プロパティがある場合:
public list<String> names { get; set; }
名前がリストに追加されるたびに 'onNamesChanged'と呼ばれる引数のカスタムイベントを生成して処理するにはどうすればよいですか?
解決
System.ComponentModel.BindingList をチェックアウトする必要があります。特に ListChangedイベント。
他のヒント
BindingTrackには、変更追跡と使用可能なさまざまな既存のイベントが組み込まれているため、おそらく最適なオプションです。以下は、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);
}
}
BindingListの代わりに ObservableCollection があります-この場合はd独自のイベントハンドラを CollectionChanged イベントにサブスクライブして、アクションに応じたイベント。
David Mohundroは1つのアプローチを示しています。もう1つのオプションは、Collection <!> lt; T <!> gt;から継承することです。さまざまなメソッドをオーバーライドします:
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 <!> lt; T <!> gt;)を作成できます-多くの作業、ほとんど利益なし。
非正統的なアプローチでは、PostSharpなどのAOPフレームワークを使用して<!> quot; weave <!> quot;アクセサが呼び出される前後にハンドラが呼び出され、イベントが発生します。
プロパティにアクセスするときの事前および/または事後処理コードを含む外部クラスを作成し、プロパティの値が事前と事後の間で変更されたかどうかを確認し、イベントを発生させます。
(ハンドラコード内で)比較のために値を取得している間、無限ループに入る可能性があることに注意してください(プロパティアクセサを呼び出し、AOPハンドラを呼び出し、アクセサを呼び出すなど)。バッキングフィールドを取得するには、このプロパティを含むクラスに反映する必要がある場合があります。
リストをプロパティとして直接公開する必要はなく、おそらくクラスにIListなどを実装させてから、Add()メソッドでイベントハンドラーを起動させる必要があります。