【发布时间】:2010-07-27 15:18:39
【问题描述】:
Silverlight 社区付出了很多努力来尽可能地保持 XAML 的代码隐藏在代码中。这背后的真正动机是什么?
例如,使用命令而不是事件处理程序有什么好处?如果我有
<Button x:Name="SaveButton" Content="Save" Click="SaveButton_Click" />
...
private void SaveButton_Click(object sender, RoutedEventArgs e) {
_myViewModel.SaveChanges();
}
那为什么首选这个呢?
<Button x:Name="SaveButton" Content="Save" Command="{Binding SaveCommand}" />
显然,我的视图模型中的SaveCommand 将有效地调用SaveChanges()。
这可能导致视图是 100% XAML 的情况,甚至在 XAML 中实例化视图模型,并且视图和视图模型之间的连接完全通过绑定完成。当然它很干净,但还有什么?灵活的?为什么?视图仍然需要使用正确的 ViewModel,所以如果两者之间的联系存在并且是隐式的,为什么不让它更明确呢?它还具有失去编译时支持的缺点。如果我将按钮连接到不存在的事件处理程序,编译器会告诉我。如果我绑定到不存在的命令,则不会。
【问题讨论】:
-
我倾向于同意你的观点,如果你没有那种命令广泛有用的应用程序,那么我真的看不出额外的打字能给你带来什么。正如您所说,它不会以某种方式影响视图模型的可测试性。有些人认为,一旦您开始拥有任何代码隐藏代码,您将无法阻止自己将逻辑潜入其中,这应该在视图模型中。
-
偏好是由于可测试性而不是 xaml/codebehind 标记。如果您的代码示例有两种方法来测试这些替代方案,那么这个问题将非常有趣。即您对 ViewModel.SaveChanges() 的测试和基于 ICommand 的测试。
标签: silverlight mvvm icommand