我喜欢MVVM。虽然不是非常热爱,但还是喜欢它的大部分内容。但我继续阅读一些鼓励编写很多代码以便在XAML中编写任何代码的文章。
让我给你举个例子。
最近,我想将ViewModel中的一个命令连接到ListView的MouseDoubleClickEvent上。我不太确定如何实现这个功能。幸运的是,Google有关于这方面的答案。我找到了以下文章:
- http://blog.functionalfun.net/2008/09/hooking-up-commands-to-events-in-wpf.html
- http://joyfulwpf.blogspot.com/2009/05/mvvm-invoking-command-on-attached-event.html
- http://sachabarber.net/?p=514
- Link
- http://marlongrech.wordpress.com/2008/12/13/attachedcommandbehavior-v2-aka-acb/
虽然这些解决方案在理解命令方面很有帮助,但也存在一些问题。其中一些解决方案会将"Internal"附加到依赖属性之后,导致WPF设计器无法使用,但CLR可以找到它。其中一些解决方案不允许对同一控件使用多个命令。其中一些解决方案不允许使用参数。
尝试了几个小时后,我决定采用以下做法:
private void ListView_MouseDoubleClick(object sender, MouseButtonEventArgs e) {
ListView lv = sender as ListView;
MyViewModel vm = this.DataContext as MyViewModel;
vm.DoSomethingCommand.Execute(lv.SelectedItem);
}
那么,MVVM 纯粹主义者,请告诉我这种方式的问题在哪里?我仍然可以对我的命令进行单元测试。这似乎非常实用,但似乎违反了“天哪......你的代码在你的代码后台中!!!”的指导方针。请分享您的想法。
先行致谢。
ListView_MouseDoubleClick
事件可能会有些棘手,因为用户可能会在ListItem之外点击(例如滚动条、边框、填充等)。你最好使用ListViewItem.MouseDoubleClick。 - Liero