我有一個擴展方法來訂閱實現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'可以爲每個屬性名稱保存一個委託。 (是的,那是一種不同類型的容器。) –
hvd
2013-02-11 17:11:15
是的,我只是想提出一個通用的解決方案。我隱含地試圖傳達的是,帶有閉包的匿名方法在包含對捕獲變量的引用的幕後生成一個容器類。所以基本上這是同一類型的行爲,但你會明確表示...... – 2013-02-11 17:30:26
非常感謝。有用!!! 「PropertyChangedEventHandler」只會觸發一次。 – Nadya 2013-02-12 09:07:44