MVVM、MVVMLight、MVVMLight Toolkit 之我的理解
MVVM Light
最近才解除到WPF,也知道MVVM Light是一个不错的设计模式
学习了几天,写一下我自己对这个理解
大家都知道,普通的三层模式,是将业务逻辑层,数据层跟UI分开,但是UI的后台内代码还是很多
MVVM Light 的理想状态,是将后台的代码抽空,当然这是极限状态。
这里写了一个小例子,我觉得还是可以展示下MVVM Light的核心思想和表现
主要实现是 主窗口和 子窗口之间的通信。
这个是MVVM Light的项目结构 (其中子页面的那个名字取的不好,失望)
- 大致的思路是这样的,一般情况下 View中的一个页面,在ViewModel里面对应个ViewModel类。
下面我们开始一步一步的,编写这个Demo,希望大家有一点了解。
主页面画这样的页面
- 接收的文本框修改为Text="{Binding Value,Mode=TwoWay}" ,发送为Text="{Binding Value,Mode=TwoWay}"
- 发送的按钮修改 Command="{Binding Tochild}"
#这里解释下{Binding Value,Mode=TwoWay} ,MainWindow主界面加载的时候,会有一个mianviewmodel的实体类,这地方的Value是类的一个属性,而Mode=TwoWay,意思是双向加载,
也就是 当修改实体类中的Value时,页面中文本框的值会修改发生变化,同样,在页面中修改文本框,实体类中的Value属性值也会修改
#解释下 Command="{Binding Tochild}" 这里的Tochild是一个RelayCommand,先不说
下面我来说 mainviewmodel中的
定义两个属性
public class MainViewModel : ViewModelBase { /// <summary> /// Initializes a new instance of the MainViewModel class. /// </summary> public MainViewModel() { Messenger.Default.Register<string>(this, "mainwindow", msg => show(msg)); Tochild = new RelayCommand(sendtochild); } public RelayCommand Tochild { get; set; } public void sendtochild() { Messenger.Default.Send<string>(Send, "childwindow"); } public void show(string str) { Value = str; } private string send; /// <summary> /// 发送 /// </summary> public string Send { get { return send; } set { send = value; RaisePropertyChanged("Send"); } } private string value; /// <summary> /// 接收 /// </summary> public string Value { get { return this.value; } set { this.value = value; RaisePropertyChanged("Value"); } } }
#这里解释下, RaisePropertyChanged("Send"); 每个属性的set后有一句 RaisePropertyChanged,作用就是在,实体类中 当属性值修改后,会通知页面修改值(不知道这样描述是否错了)
# show()方法,修改Value属性值,而当Value值修改时,前台又会变动, 这里Send是要发送到子窗口的值,Value是从子窗体接受的值
这里再贴下viewViewModel的代码
public class viewViewmodel : ViewModelBase { public viewViewmodel() { Messenger.Default.Register<string>(this, "childwindow", msg => showvalue(msg)); ToMainwindow = new RelayCommand(sendtomain); } public RelayCommand ToMainwindow { get; set; } public void sendtomain() { Messenger.Default.Send<string>(Send, "mainwindow"); } public void showvalue(string str) { Value = str; } string value; public string Value { get { return this.value; } set { this.value = value; RaisePropertyChanged("Value"); } } string send; public string Send { get { return send; } set { send = value; RaisePropertyChanged("Send"); } } }
WPF程序 App.xaml中定义全局应用程序资源
<Application.Resources>
<local:ViewModelLocator xmlns:local="clr-namespace:mvvmdemo.Locators" x:Key="Locator" />
</Application.Resources>
红色部分 根据自己的程序 修改,要不然到时候别怪我说我Demo有问题。
class ViewModelLocator { // Create MainViewModel on demand public MainViewModel MainViewModel { get { return new MainViewModel(); } } public viewViewmodel ViewViewModel { get { return new viewViewmodel(); } } }
MainWindow 页面中的 修改成这样 <Grid DataContext="{Binding Source={StaticResource Locator},Path=MainViewModel}" >
view页面中 <Grid DataContext="{Binding Source={StaticResource Locator},Path=ViewViewModel}" >
我想你应该也知道 这句话是什么意思了吧。
在这里已经实现功能了,下一次解释 两窗体之间发送值的 Messenger
也希望高手给我一些批评建议