WPF MVC模式下的事件路由和Command

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Vblegend_2013/article/details/81634020

 1.引用DLL

C:\Program Files (x86)\Microsoft SDKs\Expression\Blend\.NETFramework\v4.0\Libraries\System.Windows.Interactivity.dll

2.建立Command接口

    public interface IDefaultCommand
    {
        event EventHandler CanExecuteChanged;
        bool CanExecute(object sender, object parameter);
        void Execute(object sender, object parameter);
    }

3.建立基于事件的Command对象

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Input;

namespace myproject.Model.Command
{
    public class CallCommand<T> : IDefaultCommand
    {
        /// <summary>
        /// 检查命令是否可以执行的事件,在UI事件发生导致控件状态或数据发生变化时触发
        /// </summary>
        public event EventHandler CanExecuteChanged
        {
            add
            {
                if (_canExecute != null)
                {
                    CommandManager.RequerySuggested += value;
                }
            }
            remove
            {
                if (_canExecute != null)
                {
                    CommandManager.RequerySuggested -= value;
                }
            }
        }

        /// <summary>
        /// 判断命令是否可以执行的方法
        /// </summary>
        private Func<Object, T, bool> _canExecute;

        /// <summary>
        /// 命令需要执行的方法
        /// </summary>
        private Action<Object,T> _execute;

        /// <summary>
        /// 创建一个命令
        /// </summary>
        /// <param name="execute">命令要执行的方法</param>
        public CallCommand(Action< Object, T> execute)
            : this(execute, null)
        {
        }

        /// <summary>
        /// 创建一个命令
        /// </summary>
        /// <param name="execute">命令要执行的方法</param>
        /// <param name="canExecute">判断命令是否能够执行的方法</param>
        public CallCommand(Action<Object, T> execute, Func<Object, T, bool> canExecute)
        {
            _execute = execute;
            _canExecute = canExecute;
        }

        /// <summary>
        /// 判断命令是否可以执行
        /// </summary>
        /// <param name="parameter">命令传入的参数</param>
        /// <returns>是否可以执行</returns>
        public bool CanExecute(object sender, object parameter)
        {
            if (_canExecute == null) return true;
            return _canExecute(sender,(T)parameter);
        }

        /// <summary>
        /// 执行命令
        /// </summary>
        /// <param name="parameter"></param>
        public void Execute(object sender, object parameter)
        {
            if (_execute != null && CanExecute(sender, parameter))
            {
                _execute(sender,(T)parameter);
            }
        }


    }
}

4.在XMAL里添加引用

xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
xmlns:cmd="clr-namespace:myproject.Model.Command"

5.加入事件代码(i:Interaction.Triggers)

        <Button Content="Test">
            <i:Interaction.Triggers>
                <i:EventTrigger EventName="Click">
                    <cmd:EventCommand Command="{Binding Save_Click}"/>
                </i:EventTrigger>
            </i:Interaction.Triggers>
        </Button>

6.在 DataContext 的model 里添加

        public IDefaultCommand Save_Click
        {
            get
            {
                return new CallCommand<RoutedEventArgs>(Btn_Click, (s, o) => { return true; });
            }
        }
        public void Btn_Click(object sender, RoutedEventArgs e)
        {

        }

OK MVC模式的 事件路由添加完成

下面说下MVC中 Button 的 Command

    public class QueryCommand : ICommand
    {
        #region Fields
        private Action _execute;
        private Func<bool> _canExecute;
        #endregion

        public QueryCommand(Action execute)
            : this(execute, null)
        {
        }
        public QueryCommand(Action execute, Func<bool> canExecute)
        {
            if (execute == null)
                throw new ArgumentNullException("execute");
            _execute = execute;
            _canExecute = canExecute;
        }

        #region ICommand Member

        public event EventHandler CanExecuteChanged
        {
            add
            {
                if (_canExecute != null)
                {
                    CommandManager.RequerySuggested += value;
                }
            }
            remove
            {
                if (_canExecute != null)
                {
                    CommandManager.RequerySuggested -= value;
                }
            }
        }

        public bool CanExecute(object parameter)
        {
            return _canExecute == null ? true : _canExecute();
        }

        public void Execute(object parameter)
        {
            _execute();
        }
        #endregion
    }

 Model

        public ICommand Search
        {
            get
            {
                return new QueryCommand(Searching, () => { return true; });
            }
        }

        public void Searching()
        {

        }

XMAL

        <Button Content="Test" 
                Command="{Binding Path=Search}" 
                CommandParameter="{Binding ElementName=SearchText}" >

猜你喜欢

转载自blog.csdn.net/Vblegend_2013/article/details/81634020
今日推荐