zoukankan      html  css  js  c++  java
  • 【WPF/MVVM】把鼠标事件写到Controller层

    要使用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的相互关系如下图:

    这里写图片描述

  • 相关阅读:
    二叉树(前序,中序,后序遍历)查找
    插入查找
    归并排序
    解密Spring AOP 之AspectJ与动态代理基础知识
    常用的sql
    python 集合方法
    python 字典
    python 列表方法
    python 序列类型
    fake_useragent
  • 原文地址:https://www.cnblogs.com/guxin/p/wpf-waf-mvvm-mouse-event.html
Copyright © 2011-2022 走看看