wpf mvvm学习笔记

2017-07-19 08:35:45来源:CSDN作者:bornonew人点击

新的工作需要用到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的反注册消息(我还没找到别的方式自动释放,比较少用这种方式),否则即使响应窗体关闭,逻辑仍会处理,如果重新打开窗体,逻辑会因多次注册而被响应很多次。






最新文章

123

最新摄影

微信扫一扫

第七城市微信公众平台