EventToCommand

在WPF中,并不是所有控件都有Command,例如TextBox,那么当文本改变,我们需要处理一些逻辑,这些逻辑在ViewModel
中,没有Command如何绑定呢?这个时候我们就用到EventToCommand,事件转命令,可以将一些事件例如TextChanged,Checked等
转换成命令的方式。

不带参数的EventToCommand

AppView.xaml

       <CheckBox>
<i:Interaction.Triggers>
<i:EventTrigger EventName="Checked">
<command:EventToCommand Command="{Binding CheckedCommand}"></command:EventToCommand>
</i:EventTrigger>
<i:EventTrigger EventName="Unchecked">
<command:EventToCommand Command="{Binding UnCheckedCommand}"></command:EventToCommand>
</i:EventTrigger>
</i:Interaction.Triggers>
</CheckBox>

AppViewModel.cs

        public RelayCommand CheckedCommand
{
get;
set;
} public RelayCommand UnCheckedCommand
{
get;
set;
} public AppViewModel()
{
CheckedCommand = new RelayCommand(Checked); UnCheckedCommand = new RelayCommand(UnChecked);
} private void Checked()
{
MessageBox.Show("Checked");
} private void UnChecked()
{
MessageBox.Show("Unchecked");
}

带参数的EventToCommand

AppView.xaml

        <Button Width="100" Height="30" Margin="0,100,0,0">
<i:Interaction.Triggers>
<i:EventTrigger EventName="Click">
<command:EventToCommand Command="{Binding ShowTxtCommand}" PassEventArgsToCommand="True" CommandParameter="Hello"></command:EventToCommand>
</i:EventTrigger>
</i:Interaction.Triggers>
</Button>

AppViewModel.cs

        /// <summary>
/// 显示消息命令
/// </summary>
public RelayCommand<string> ShowTxtCommand
{
get;
set;
} public AppViewModel()
{
ShowTxtCommand=new RelayCommand<string>(ShowMsg);
} /// <summary>
/// 命令具体实现
/// </summary>
private void ShowMsg(string msg)
{
MessageBox.Show(msg);
}

转换传递的参数

也许你想知道事件是谁触发的,从而进行一些业务逻辑,那么我们需要从IEventArgsConverter继承

EventArgsConverter.cs

public class EventArgsConverter : IEventArgsConverter
{
public object Convert(object value, object parameter)
{
var args = (RoutedEventArgs)value;
var btn = parameter as Button; return btn.Name;
}
}

AppView.xaml

   <Button Width="100" Height="30" Margin="0,100,0,0" x:Name="btn">
<i:Interaction.Triggers>
<i:EventTrigger EventName="Click">
<command:EventToCommand Command="{Binding ShowNameCommand}" EventArgsConverter="{StaticResource ArgsConverter}" EventArgsConverterParameter="{Binding ElementName=btn}" PassEventArgsToCommand="True"></command:EventToCommand>
</i:EventTrigger>
</i:Interaction.Triggers>
</Button>

AppViewModel.cs

    public RelayCommand<string> ShowNameCommand
{
get;
set;
} public AppViewModel()
{ ShowNameCommand = new RelayCommand<string>(ShowName);
} private void ShowName(string name)
{
MessageBox.Show(name);
}

看了EventToCommand的源码,并没有什么帮助,我猜测它的实现是这样的,EventToCommand属于附加
属性,它就能获取到它所附加的对象即控件本身,然后它还能Binding命令,比如我们附加的对象是Button
,那么就在它的Click事件时,触发Command命令,同样,有条件判断Command是否能执行时,可以设置
控件的IsEnabled属性。

MVVM 事件转命令1的更多相关文章

  1. MVVM - 事件转命令2

    在使用MVVM模式时, 按照模式的规则是尽量不直接使用事件. 所以对于以前一直使用事件模式的同行来说确实有点头疼. 还好微软给我们提供了几种间接使用事件(命令)的方法, 下面我就来看看这几种方法: I ...

  2. WPF Prism框架下基于MVVM模式的命令、绑定、事件

    Prism框架下的自定义路由事件和命令绑定 BaseCode XAML代码: <Button x:Class="IM.UI.CommandEx.PrismCommandEx" ...

  3. WPF使用MVVM(三)-事件转命令

    WPF使用MVVM(三)-事件转命令 上一节介绍了WPF中的命令,可是仅仅介绍的是WPF框架给我们提供的点击命令,也就是用Command属性来绑定一个命令,用来响应按钮的点击行为!显然这是不够的,界面 ...

  4. WPF自学入门(十一)WPF MVVM模式Command命令 WPF自学入门(十)WPF MVVM简单介绍

    WPF自学入门(十一)WPF MVVM模式Command命令   在WPF自学入门(十)WPF MVVM简单介绍中的示例似乎运行起来没有什么问题,也可以进行更新.但是这并不是我们使用MVVM的正确方式 ...

  5. WPF自学入门(十一)WPF MVVM模式Command命令

    在WPF自学入门(十)WPF MVVM简单介绍中的示例似乎运行起来没有什么问题,也可以进行更新.但是这并不是我们使用MVVM的正确方式.正如上一篇文章中在开始说的,MVVM的目的是为了最大限度地降低了 ...

  6. WPF之事件绑定命令

    目录 事件绑定意义 无参数的事件绑定 带EventArgs参数的事件绑定 使用事件绑定 扩展:基于InvokeCommandAction源码的实现(推荐) 参考资料 事件绑定意义 一般事件的处理程序都 ...

  7. 在WPF中的ItemsControl中使用事件和命令(Using events and Commands within ItemsControl in WPF)

    Say I have a standard WPF ItemsControl bound to an ObservableCollection of "Dog" objects l ...

  8. MVVM模式的命令绑定

    命令绑定要达到的效果 命令绑定要关注的核心就是两个方面的问题,命令能否执行和命令怎么执行.也就是说当View中的一个Button绑定了ViewModel中一个命令后,什么时候这个Button是可用的, ...

  9. WPF 事件触发命令

    方法一使用mvvmlight: xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Int ...

随机推荐

  1. 常用的jQuery学习文档及使用经验

    分享几个jQuery学习的API在线文档 1. 首推 http://hemin.cn/jq/ 原因是全中文文档,文档排列通俗易懂,容易查找,示例清楚. 2. https://www.jquery123 ...

  2. [TJOI2007] 线段

    因为每行必须走完才能到下一行,所以我们有两种决策: 1.最后留在线段左端点 2.最后留在线段右端点 这种存在状态转移且多决策的问题用动态规划来进行递推是最好不过的了. 所以我们设\(dp[i][0/1 ...

  3. ArrayList中的一些小细节@JDK8

    ArrayList中的一些小细节@JDK8 protected transient int modCount = 0; 该变量用于记录ArrayList的版本号,不可被序列化,每次对ArrayList ...

  4. kali linux之Backdoor-factory

    Backdoor-------python编写 适用于windows PE x32/x64 和Linux ELF x32/x64(OSX),支持msf payload 自定义payload 将shel ...

  5. 2019.2.15 t2

    考虑倒过来计算最短路径长度,设dis[u]表示在最坏情况下,点u到最近的一 个出口的最短路,则p个出口的dis值都是0,答案即为dis[0]. #include <cstdio> #inc ...

  6. Maven依赖的JAR包下载慢?赶紧看过来

    相信许多JAVA开发者在日常工作中时常会碰到这种情况,那就是编译Maven工程时,工程所依赖的jar包文件下载非常慢,甚至经常出现下载不成功的问题,今天,小编就给大家讲讲如何提升Maven依赖包的下载 ...

  7. vue Vue-cli 笔记

    之前用vue写项目都是用的es5,这几天看到小右弄了个命令行工具打算试水一下es6.结果老是报错,但是可以正常编译,虽然我不是处女座但是看到报错很不舒服.结果发现源代码最后一行要空一行,我心想这什么狗 ...

  8. tableView header Refresh 下拉刷新/上拉加载

    一. UIScrollView 的分类 //作为入口 #import <UIKit/UIKit.h> #import "RefreshHeader.h" #import ...

  9. MySQL压缩版Windows环境进行安装配置

    MySQL下载地址:https://dev.mysql.com/downloads/mysql/ 选择对应的系统和相应的版本后点击Download进入下载页面,不需要登录,点击下面的“No thank ...

  10. 关于导入本地maven项目pom.xml出现missing artifact org....报错处理

    一.导入本地maven项目步骤: