转自http://www.cnblogs.com/Sunpire/archive/2010/12/25/1916943.html
在 ViewModels 中增加一个 ViewModelCommand ,通过 Action<Object> 执行实际的方法。
ViewModelCommand.cs
PS:日前,在看有关 Object Value 的用法时,提到了 struct ,struct 是存储在 Heap 上,而引用类型是存储在
Stack 上的,在内存分配及垃圾回收等方面 struct 的性能更高,所以这里把 ViewModelCommand 改为 struct。
在 LoginViewModel.cs 中增加两个Command,分别用于前台 UI 的两个 Button 的 Command 绑定。
LoginViewModel.cs
同时,尝试将要执行 Validation 的 UI 引用移入 ViewModel 中
LoginViewModel.cs
这样,View 就更简单了,在 Xaml 中变为
<Button Content="换一个" Grid.Column="3" Grid.Row="2" Height="23" Margin="8"
Name="btnChangeValidationCode" Width="75"
Command="{Binding GenerateValidationCodeCommand}" />
<Button Content="登录" Grid.Row="3" Grid.ColumnSpan="4" Margin="8" Name="btnLogin"
Command="{Binding LoginCommand}" />
LoginPage.cs 变为
LoginPage.cs
使用 MVVM ,好处很明显,LoginPage.cs 中的代码几乎减少至只剩下 实例化 ViewModel 和为 DataContext
赋值的语句了,代码人员和设计人员可以分开工作。
但是,View 和 ViewModel 之间如何依赖?
显然 View 是依赖于 ViewModel 的,但是 ViewModel 该不该依赖于 View ,也就是说 LoginPageViewModel 该不该
拥有一个指向 LoginPage 实例的属性或字段?
在 Silverlight Templated Control 中,代码和Xaml是分离的,代码和Xaml通过约定的 TemplatePart 的名字各自
进行编码,而代码在运行时通过 GetTemplateChild(name) 取得控件的实例,
这种分离,允许我们把 Silverlight Templated Control定义在最低层次的类库,而在运行时于最高层的 App 应用程序中
重新为 Silverlight Templated Control 指定外观,那么,在 MVVM 中,View 和 ViewModel 是否也能这样分离呢?
如果要实现这种分离,那么 ViewModel 便不可能依赖于 View ,最多只能是定义一些 interface,View 从 interface 中
派生,而 ViewModel 依赖于 interface。
联想起 ASP.NET MVC 2,每一个页面对应一个 Model,这个 Model 其实就相当于是 ViewModel,依稀记得 MVC 2 中
ViewModel 是不会关注 View 的。
嗯,存疑,先至此,欢迎各位进行指正和讨论。