我有一些邏輯取決於兩個屬性被設置,因爲它執行時,兩個屬性都有一個值。例如:如何處理MVVM ViewModel中的「SelectedItemChanged」事件?
private void DoCalc() {
if (string.IsNullOrEmpty(Property1) || string.IsNullOrEmpty(Property2))
return;
Property3 = Property1 + " " + Property2;
}
該代碼將需要每次Property1或Property2改爲執行,但我無法弄清楚如何做到這一點的風格上可以接受的方式。下面是選擇,因爲我看到他們:
1)從視圖模型
調用方法我沒有這個概念有問題,因爲邏輯仍然是在視圖模型 - 我不是一個「不代碼隱藏「納粹。然而,'觸發'邏輯(當任何一個屬性發生變化時)仍然在UI層,我不喜歡。代碼隱藏應該是這樣的:
void ComboBox_Property1_SelectedItemChanged(object sender, RoutedEventArgs e) {
viewModel.DoCalc();
}
2)從屬性setter
調用方法這種方法似乎是最「純」,但它似乎也難看,彷彿邏輯是隱藏的。它應該是這樣的:
public string Property1 {
get {return property1;}
set {
if (property1 != value) {
property1 = value;
NotifyPropertyChanged("Property1");
DoCalc();
}
}
}
3)掛接到PropertyChanged事件
現在,我想這可能是正確的做法,但感覺怪異掛接到在實施屬性更改事件視圖模型。這將是這個樣子:
public ViewModel() {
this.PropertyChanged += new PropertyChangedEventHandler(ViewModel_PropertyChanged);
}
void ViewModel_PropertyChanged(object sender, PropertyChangedEventArgs e) {
if (e.PropertyName == "Property1" || e.PropertyName == "Property2") {
DoCalc();
}
}
所以,我的問題是,如果你是通過與這一要求,你更喜歡哪一種方法,看看實施的一些源代碼瀏覽(爲什麼?)。感謝您的任何意見。
除非第三屬性是小事就像在你的榜樣,二傳手'Property1'和'Property2'也應該設置一些'IsProperty3Invalid'標誌,這對於'Property3'吸氣會檢查看看是否需要再次調用「DoCalc」。 – Gabe
這是一個有趣的想法(我顯然沒有考慮過)。我不得不考慮這個問題,因爲在'真實'代碼中,屬性3有時由prop1和prop2設置,但如果它不是由這些條件設置的,則用戶必須手動填寫它。可以使用這種方法來完成......我會對其進行編碼並查看它的外觀。好東西。 – Travis
標記爲正確的,只是給你一些道具,但不知道我100%同意。需要浸泡在它:)。 – Travis