button的Command在绑定一个命令时,被绑定的命令是实现了ICommand接口的类对象:
mvvm模式下,与业务逻辑有关的Command绑定ViewModel或Model中的命令,这个命令必须是继承自ICommand的类的实例
与业务逻辑无关的命令,只和界面相关的 Command绑定RoutedCommand或RoutedUICommand,这2个也是继承自ICommand
其中还有继承自RoutedUICommand的一些系统内置的命令。
ApplicationCommands:提供一组标准的与应用程序相关的命令
ComponentCommands:提供一组标准的与组件相关的命令
NavigationCommands:提供一组标准的与导航相关的命令
MediaCommands:提供一组标准的与媒体相关的命令
EditingCommands:提供一组标准的与编辑相关的命令
1.CommandBinding
ApplicationCommands.New
<Window.CommandBindings>
<CommandBinding Command="ApplicationCommands.New"
Executed="CommandBinding_Executed_1"
CanExecute="CommandBinding_CanExecute_1"/>
</Window.CommandBindings>
<Grid>
<StackPanel>
<Button Height="30" Width="30" Command="ApplicationCommands.New"
Content="{Binding RelativeSource={RelativeSource Self},Path=Command.Text}"
CommandManager.Executed="CommandBinding_Executed_1"
CommandManager.CanExecute="CommandBinding_CanExecute_1" />
<TextBox Name="textbox"/>
</StackPanel>
</Grid>
private void CommandBinding_Executed_1(object sender, ExecutedRoutedEventArgs e)
{
//dosomething
}
private void CommandBinding_CanExecute_1(object sender, CanExecuteRoutedEventArgs e)
{
if(this.textbox != null)
{
if(this.textbox.Text=="")
{
e.CanExecute = true;
}
}
}
命令的特点就是可以通过 CommandManager.CanExecute去添加一些逻辑,通过e.Canexecute的值来决定此操作是否可用。
textbox的text为空,则“新建”按钮不可用
textbox的text不为空,则“新建”按钮可用
这些判断都是与业务逻辑无关的,所以不用写在ViewModel中。
第2个例子:不用写execute和惨execute的内置命令
2个textbox和2个button按钮,分别绑定ApplicationCommands.Copy和ApplicationCommands.Paste
是否可复制和是否可粘贴的逻辑不需要我们写,对于复制来说,只要ApplicationCommands.Copy的Target有选中,则自动变更按钮状态
是否可粘贴,只要剪贴板有东西可以粘贴到ApplicationCommands.Paste的Target的目标中,则自动变更按钮状态
可复制时,“复制”按钮自动可用
当点击复制按钮后,“粘贴按钮自动可用”
<Window.CommandBindings>
<CommandBinding Command="ApplicationCommands.Copy"/>
<CommandBinding Command="ApplicationCommands.New"
Executed="CommandBinding_Executed_1"
CanExecute="CommandBinding_CanExecute_1"/>
</Window.CommandBindings>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<StackPanel >
<TextBox Name="tb1"/>
<Button Command="ApplicationCommands.Copy"
Content="{Binding RelativeSource={RelativeSource Self},Path=Command.Text}"
CommandTarget="{Binding ElementName=tb1}"/>
</StackPanel>
<StackPanel Grid.Column="1">
<TextBox Name="tb2"/>
<Button Command="ApplicationCommands.Paste"
Content="{Binding RelativeSource={RelativeSource Self},Path=Command.Text}"
CommandTarget="{Binding ElementName=tb2}"/>
</StackPanel>
</Grid>
一个命令包含4部分:
(1)命令command:要执行的动作。
(2)命令源command source:发出命令的对象(继承自ICommandSource)。
(3)命令目标command target:执行命令的主体
(4)命令绑定command binding:被关联的对象
2.InputBindings
用来指定一些快捷键,通过快捷键去触发命令
<Window.InputBindings>
<KeyBinding Command="{Binding testcmd }" Modifiers="Ctrl" Key="D"/>
</Window.InputBindings>
<Grid>
<Button Height="30" Width="30">
<KeyBinding Command="{Binding testcmd}" Modifiers="Ctrl" Key="D"/>
</Button>
</Grid>
这里的command绑定的是ViewModel中的命令。