WPF知识点全攻略11- 命令(Command)

摘要:
该命令继承自ICommand接口。ICommand公开了两个方法,Execute和CanExecute,以及一个事件CanExecuteChanged。命令的两个重要辅助属性,由CommandTarget指定的命令的目标元素,CommandParameter设置命令参数,以及CommandManager在元素中添加和删除PreviewExecuted、Execute、PreviewCanExecute和CanExecute事件处理程序。命令的优点不仅仅是上面提到的简单使用。最重要的是,在使用MVVM模式时,可以将命令和依赖属性组合起来,通过绑定实现UI和数据的良好分离,从而减少视图和模型之间的耦合。该命令直接绑定到元素控件,该控件通常会触发最常用的属性,例如Button的Click。如果你想绑定其他属性呢,MoseMove?

先看一下命令的简单使用:

<Window.CommandBindings>
    <CommandBinding Command="ApplicationCommands.Cut" CanExecute="CutCommand_CanExecute" Executed="CutCommand_Executed" />
    <CommandBinding Command="ApplicationCommands.Paste" CanExecute="PasteCommand_CanExecute" Executed="PasteCommand_Executed" />
</Window.CommandBindings>

<Window.InputBindings>
    <KeyBinding Gesture="Alt+X" Command="ApplicationCommands.Cut"></KeyBinding>
    <KeyBinding Modifiers="Alt" Key="V" Command="ApplicationCommands.Paste"></KeyBinding>
</Window.InputBindings>

<DockPanel>
    <WrapPanel DockPanel.Dock="Top" Margin="3">
        <Button Command="ApplicationCommands.Cut" Width="60">_Cut</Button>
        <Button Command="ApplicationCommands.Paste" Width="60" Margin="3,0">_Paste</Button>
    </WrapPanel>
    <TextBox AcceptsReturn="True" Name="txtEditor" />
</DockPanel>
private void CutCommand_CanExecute(object sender, CanExecuteRoutedEventArgs e)
{
    e.CanExecute = (txtEditor != null) && (txtEditor.SelectionLength > 0);
}
private void CutCommand_Executed(object sender, ExecutedRoutedEventArgs e)
{
    txtEditor.Cut();
}
private void PasteCommand_CanExecute(object sender, CanExecuteRoutedEventArgs e)
{
    e.CanExecute = Clipboard.ContainsText();
}
private void PasteCommand_Executed(object sender, ExecutedRoutedEventArgs e)
{
    txtEditor.Paste();
}

对比一下类似WinForm事件写法:

<DockPanel>
    <WrapPanel Margin="3" DockPanel.Dock="Top">
        <Button Width="60" Click="Cut_Click">_Cut</Button>
        <Button Width="60" Margin="3,0" Click="Paste_Click">_Paste</Button>
    </WrapPanel>
    <TextBox Name="txtEditor" AcceptsReturn="True" />
</DockPanel>
private void Cut_Click(object sender, RoutedEventArgs e)
{
    txtEditor.Cut();
}

private void Paste_Click(object sender, RoutedEventArgs e)
{
    txtEditor.Paste();
}

命令模式对比普通事件模式,可以通过CanExecute设置操作是否可用,可以比较方便的把操作绑定到点击按钮、快捷键等多种类型。

命令继承自ICommand接口,ICommand 公开了两种方法 Execute 和 CanExecute,以及一个事件 CanExecuteChanged。

命令的两个重要辅助属性,CommandTarget指定的命令的目标元素,CommandParameter设置命令参数,CommandManager在元素中添加和删除 PreviewExecuted、Executed、PreviewCanExecute 和 CanExecute 事件处理程序。

命令的优点不止以上的简单使用,最关键的是在使用MVVM模式中,命令和依赖属性配合通过Binding可以很好的做到UI和数据分离,降低View和Model的耦合。

命令直接绑定到元素控件上,一般会触发最常用属性,比如Button的Click,如果想绑定其他属性MoseMove的动作怎么办呢?

可以引入System.Windows.Interactivity.dll

xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"
<Button Name="btn" Content="Button" Height="33" HorizontalAlignment="Left" Margin="40,24,0,0" VerticalAlignment="Top" Width="109">
    <i:Interaction.Triggers>
        <i:EventTrigger EventName="Click">
            <i:InvokeCommandAction Command="{Binding Command1}" CommandParameter="10" />
        </i:EventTrigger>
        <i:EventTrigger EventName="MouseMove">
            <i:InvokeCommandAction Command="{Binding Command2}" CommandParameter="{Binding ElementName=btn}" />
        </i:EventTrigger>
    </i:Interaction.Triggers>
</Button>

使用System.Windows.Interactivity.dll不仅可以给Button、CheckBox等添加命令绑定,也可以给Image、Grid、Border等添加各种事件绑定。

免责声明:文章转载自《WPF知识点全攻略11- 命令(Command)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇boost.asio新框架的设计概念总结三元表达式(三目运算符)和二元表达式(二目运算符)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

linux简单命令与Shell脚本

说明1、#表示root用户登录,$表示普通用户登录2、|符号是管道符,用于把|前的输出作为后面命令的输入3、>表示追加并覆盖的意思4、>>两个大于符号,表示追加命令1、cd命令:切换目录cd /home 进入/home目录cd ../返回上一级目录cd  ./当前目录2、ls命令:产看文件及目录ls  ./ 查看当前目录所有的文件和目录l...

powerbuilder 在pb里面怎么把文件编译成exe文件

生成exe步骤:(1)单击powerBar工具栏止的New按钮,打开New对话框,选择Project选项卡,选择Application Wizaard选项;(2)单击OK按钮,打开向导;(3)单击Next按钮进入定义应用所包含的库;(4)单击Next按钮,进入需要他建可执行的程序项目;(5)单击Next按钮,定义可热功当执行文件的名,如果项目包含资源文件,...

9.Redis详解(九)------ 哨兵(Sentinel)模式详解

在上一篇博客----Redis详解(八)------ 主从复制,我们简单介绍了Redis的主从架构,但是这种主从架构存在一个问题,当主服务器宕机,从服务器不能够自动切换成主服务器,为了解决这个问题,我们又介绍了哨兵模式,本篇博客我们继续深入的介绍一下这种模式. 1、架构图 2、服务器列表 3、搭建主从模式 ①、主要配置项 主服务器(上图的Node1)配...

WPF中ToolTip的自定义

ToolTip或者PopUp这个控件在做界面时会经常用到。如何对ToolTip进行自定义呢? 1.首先自定义tooltip的controlTemplate,完全清除系统默认效果, 如下:             <ControlTemplatex:Key="TooltipTemplate"TargetType="ToolTip">...

windows下gVim(Vi/vim)基本使用:让你体会到什么才是真正的编辑利器

Vim 是一个Linux 平台上功能非常强大的编辑器,他是早年的Vi 编辑器的加强版。这个gVim 是windows 版的,并且有了标准的windows 风格的图形界面,所以叫g(graphical)Vim。我们可以将gvim 理解为vim(vi的加强版)图形化版本,其指令和用法都完全相同,所以可以參考vim的指令。这是一个国际版本,会根据安装的平台自动选...

WPF绑定错误

listbox绑定遇到了奇怪的报错如下: System.Windows.Data Error: 4 : Cannot find source for binding with reference 'RelativeSource FindAncestor, AncestorType='System.Windows.Controls.ItemsControl'...