我有一些逻辑取决于两个属性被设置,因为它执行时,两个属性都有一个值。例如:如何处理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