【发布时间】:2010-03-13 22:31:36
【问题描述】:
我有一些逻辑取决于设置的两个属性,因为它在两个属性都有值时执行。例如:
private void DoCalc() {
if (string.IsNullOrEmpty(Property1) || string.IsNullOrEmpty(Property2))
return;
Property3 = Property1 + " " + Property2;
}
每次更改 Property1 或 Property2 时都需要执行该代码,但我无法弄清楚如何以一种风格上可接受的方式执行此操作。以下是我看到的选择:
1) 从 ViewModel 调用方法
我对此没有概念上的问题,因为逻辑仍在 ViewModel 中 - 我不是“无代码隐藏”纳粹。但是,“触发”逻辑(当任一属性更改时)仍在 UI 层中,我不喜欢。代码隐藏如下所示:
void ComboBox_Property1_SelectedItemChanged(object sender, RoutedEventArgs e) {
viewModel.DoCalc();
}
2) 从属性设置器调用方法
这种做法看起来最“纯粹”,但也显得丑陋,仿佛隐藏了逻辑。它看起来像这样:
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();
}
}
所以,我的问题是,如果您正在浏览一些具有该要求的源代码,您希望看到哪种方法被实现(以及为什么?)。感谢您的任何意见。
【问题讨论】:
标签: c# wpf silverlight mvvm