版权声明:本文为博主原创文章,未经博主允许不得转载。 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}" >