新的工作需要用到mvvm框架,这几天抽时间系统了解了一下,记录如下。
具体用到的可以是三个方面,(数据绑定,命令绑定,消息机制)
1.数据绑定
和wpf差不多,所有的viewmodel都继承ViewModelBase类,在里面的对象如果要可以绑定,都可以直接用this.RaisePropertyChanged完成即可。
2.命令绑定
在xaml中的事件命令,都可以在viewmodel层去具体实现。
如一个button的click事件
<Button x:Name="btn1" Content="btn1" Command="{Binding Btn1ClickCommand}" CommandParameter="{Binding SNotice}" />
在viewmodel中,完成具体的事件
private ICommand _Btn1ClickCommand = null;
public ICommand Btn1ClickCommand
{
get { return _Btn1ClickCommand ?? new RelayCommand<SchoolNotice>(Btn1Click); }
}
private void Btn1Click(SchoolNotice schoolNotice)
{
Console.WriteLine(schoolNotice.Msg);
}
3.消息机制
这是我感觉比较好用的一点。之前如果不同窗体之前消息传递,需要用委托实现,这样耦合性就不好。如果用了消息机制,在某些情况下,耦合性会好很多。
消息用到主要是两部分,一个是不同窗体之前的消息传递(viewmodel和viewmodel之间传递) 另一个是 窗体的view和viewmodel之间传递,比如业务中会设计到界面的变化,这时给view层发送一个消息,让其去处理,而不要放在viewmodel中去处理界面的变化。
消息机制 分四块,1注册消息 2编写收到消息后,具体的业务逻辑 3发送消息 4反注册消息。
注册
GalaSoft.MvvmLight.Messaging.Messenger.Default.Register<SchoolNotice>(this,GMessageType.btn1Type,Button1Click);
发送
GalaSoft.MvvmLight.Messaging.Messenger.Default.Send<SchoolNotice>(schoolNotice, GMessageType.btn1Type);
反注册
this.Unloaded += (sender, e) => Messenger.Default.Unregister<SchoolNotice>(this,GMessageType.btn1Type,Button1Click);
具体的逻辑
private void Button1Click(SchoolNotice schoolNotice)
{
Console.WriteLine("Button1Click:"+schoolNotice.Msg);
}
如果是viewmodel和viewmodel之前进行消息传递,一定要在view层去手动调用viewmodel的反注册消息(我还没找到别的方式自动释放,比较少用这种方式),否则即使响应窗体关闭,逻辑仍会处理,如果重新打开窗体,逻辑会因多次注册而被响应很多次。
代码点击打开链接