【WPF】【MVVM】把鼠标事件写到Controller层

来源:互联网 发布:淘宝客费用怎么算 编辑:程序博客网 时间:2024/06/15 21:56

要使用Mouse Event,最快捷的方法便是前台控件直接绑定事件,然后再后台代码中实现。
在MVVM中,View层的后台代码无法调用Contrller层的函数。(反过来可以Controller –> ViewModel –> View)

需求:把鼠标事件写到Controller层中,以便于调用Controller层的函数。

采用WAF框架
前台控件绑定鼠标事件:

<Image PreviewMouseMove="Image_PreviewMouseMove"/>  <!-- 其他无关属性已省略 -->

后台使用Command处理鼠标事件:

private readonly Lazy<MyViewModel> viewModel;public MyWindow(){    InitializeComponent();    viewModel = new Lazy<MyViewModel>(() => ViewHelper.GetViewModel<MyViewModel>(this));}private void Image_PreviewMouseMove(object sender, MouseEventArgs e){    // 只能传一个参数    viewModel.Value.MyCommand.Execute(new object[] { sender, e });}

ViewModel中声明这个Command

private ICommand myCommand;public ICommand MyCommand{    get { return myCommand; }    set { SetProperty(ref myCommand, value); }}

Controller层实现这个Command的真正功能,关键代码:

private readonly DelegateCommand myCommand;public MyController(...){    this.myCommand = new DelegateCommand(p => MyCommandDoWork((object[])p));}public void Initialize(){    myViewModel.MyCommand= myCommand ;}void MyCommandDoWork((object[])p){    object sender = p[0];    MouseButtonEventArgs e = p[1] as MouseButtonEventArgs;    Image img = sender as Image;    // todo......}

通过以上办法,可以把所有的鼠标事件都搬到Controller层中,非常的方便!


小结:

  • 做个思维导图总结一下,在WAF框架中,MVVM的相互关系如下图:

这里写图片描述

0 0
原创粉丝点击