您的位置:首页 > 其它

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

2017-01-05 12:51 225 查看
要使用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的相互关系如下图:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  wpf mvvm