到目前爲止,我的模型實現了INotifyPropertyChanged
,每個屬性都引發了這個事件。幾乎所有ViewModel都通過PropertyChangedEventHandler
來收聽這些更改。我應該創建大量的PropertyChangedEventHandler還是測試PropertyChangedEventArgs?
問題在於,即使屬性更改對視圖不重要,也會爲模型中的每個更改調用此處理函數。
一個選項是檢查哪個屬性引發了該事件。但是,我不喜歡這個想法來測試PropertyName字符串。它要求,我已經避免與調用模型像PropertyChanged.Notify(()=> PropertyName)
我看到的第二個選項是屬性名的硬編碼來實現我的所有屬性單一事件:
public event PropertyChangedEventHandler LayerChanged;
public event PropertyChangedEventHandler FieldChanged;
public event PropertyChangedEventHandler LinkDictionaryChanged;
....
最佳做法是什麼?我寧願第二種選擇。
編輯:我嘗試更加具體
我的模型類的工作就像是:
public bool IsFeatureLayer
{
get { return _isFeatureLayer; }
set { PropertyChanged.ChangeAndNotify(ref _isFeatureLayer, value,() => IsFeatureLayer);}
}
或者
PropertyChanged.Notify(() => LinkDictionary);
所以,問題不是如何使電話通知更安全,因爲我已經使用擴展方法來做到這一點,而不需要屬性的字符串名稱。
問題是如何找出誰調用事件而不使用字符串。
void _MCDAExtensionPropertyChanged(object sender, PropertyChangedEventArgs e)
{
if(e.PropertyName.Equals("LinkDictionary"){
//event handling
}
}
這是完全不安全的,因爲我的模型中Property的名稱可能會改變,我必須在不同的地方修復它。
我已經在使用這個。問題在於如何區分一旦事件發生後可能發生變化的房產。 – steffan
這正是'RegisterPropertyHandler'方法正在做的事情,通過檢查事件的'PropertyName'。 – khellang
你是對的!對不起,我沒有仔細研究過你的例子。然而,它的功能就像一個魅力。 – steffan