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

本文介绍了一种在MVC模式下实现Command的方式,包括自定义Command接口、创建Command对象、在XAML中绑定Command等内容,并提供了具体的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 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}" >

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值