INotifyPropertyChanged
を実装するオブジェクトのPropertyChanged
イベントを購読する拡張メソッドがあります。静的メソッド(拡張メソッド)内の匿名イベントハンドラの登録解除
私はこのイベントが一度だけ起こりたいと思います。それ以上はない。
これは私の方法です。
public static void OnPropertyChanged<T>(this INotifyPropertyChanged target, string propertyName, Action action)
{
if (target == null)
{
return;
}
PropertyChangedEventHandler handler = (obj, e) =>
{
if (propertyName == e.PropertyName)
{
action();
}
};
target.PropertyChanged -= handler;
target.PropertyChanged += handler;
}
しかし、動作しません。このメソッドを呼び出すたびにイベントが発生するように、イベントハンドラを削除することはできません。
私は別のアプローチを試みました。
public static void OnPropertyChanged<T>(this INotifyPropertyChanged target, string propertyName, Action action)
{
if (target == null)
{
return;
}
target.PropertyChanged -= target_PropertyChanged;
target.PropertyChanged += target_PropertyChanged;
}
static void target_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
//do stuff here
}
名前のついたメソッドを使用する代わりに、次のような伝統的な方法を使用します。イベントは一度だけ発生しますが、Actionパラメータも必要です。私はこのアプローチでは使用できません。
この問題を解決するには、回避策または別の方法がありますか?静的メソッド内に匿名メソッドがありますか?
ありがとうございます。
+1コンテナクラスの考え方ですが、これは不必要に複雑です: 'Dictionary'はプロパティ名ごとに1つのデリゲートを保持できます。 (はい、これは別の種類のコンテナクラスです) –
hvd
ええ、私は汎用ソリューションを提示したかっただけです。私が暗黙に伝えようとしていたのは、クロージャを持つ匿名メソッドが、キャプチャされた変数への参照を含むシーンの背後にあるコンテナクラスを生成するということです。だから本質的には同じ種類の行動ですが、明示的にしています。 –
ありがとうございます。できます!!! 'PropertyChangedEventHandler'は一度起動します。 – Nadya