命令四要素
1、命令,一般情况都是使用 ”路由ui命令“
2、命令源:触发命令的地方。
3、命令绑定:将命令和执行方法绑定,然后在将commandbing放置在,命令目标的外围ui控件上,这样命令才能起作用。
4、命令目标:指定命令作用的地方。命令目标的设定会影响到commandbing 是否起作用。
原理
注意:PreviewExecuted、Executed、PreviewCanExecute、CanExecute 是Commandmanger 附加在命令目标上的附加路由事件(附加路由事件情况深入浅出WPF P171)。
PreviewExecuted、Executed 只有在命令源触发时候,命令目标才会发射PreviewExecuted、Executed。
PreviewCanExecute、CanExecute:只要命令源绑定命令目标后就由命令目标不停的发射PreviewCanExecute、CanExecute。
命令目标的绑定有两种方式:1、在命令源处设置CommandTarget="{Binding ElementName=text3} 2、系统自动获取键盘焦点作为命令目标。
详细解说查看 深入浅出WPF P177
绑定命令目标
1、错误的设置,把commandbing设置在命令目标 范围之内
错误代码
<Window x:Class="WpfApp1.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:local="clr-namespace:WpfApp1" mc:Ignorable="d" Name="winfrom" Title="MainWindow" Height="450" Width="800"> <Window.Resources> <CommandBinding Command="New" x:Key="Clearcommand" Executed="CommandBinding_Executed_1" CanExecute="CommandBinding_CanExecute_1"/> </Window.Resources> <Border BorderThickness="5" BorderBrush="Orange"> <Grid x:Name="gridroot" Button.Click="gridroot_Click"> <Border BorderThickness="5" BorderBrush="Orange" Width="500" Height="350"> <StackPanel > <TextBox Name="text1"> </TextBox> <TextBox Name="text2" Height="100"></TextBox> <Button Command="New" Name="text" CommandTarget="{Binding ElementName=text3}">触发命令按钮</Button> <Button Content="按钮2" Command="New" /> <Border BorderThickness="5" BorderBrush="Orange" Width="300" Height="250"> <Grid > <StackPanel> <TextBox Name="text3" Height="50">命令目标</TextBox> <Border BorderThickness="5" BorderBrush="Orange" Width="100" Height="150"> <Grid> <Grid.CommandBindings > <!--写以下代码的时候编译器不会提示 --> <StaticResource ResourceKey="Clearcommand"/> </Grid.CommandBindings> <TextBlock TextWrapping="WrapWithOverflow">不能把CommandBinding 放在命令目标范围内 ,那样命令无法正常运行</TextBlock> </Grid> </Border> <Button Content="按钮3" Height="40" /> </StackPanel> </Grid> </Border> </StackPanel> </Border> </Grid> </Border> </Window>
正确的方式
必须把commandbing设置在命令目标范围之外,命令才能正常运行。
<Window x:Class="WpfApp1.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:local="clr-namespace:WpfApp1" mc:Ignorable="d" Name="winfrom" Title="MainWindow" Height="450" Width="800"> <Window.Resources> <CommandBinding Command="New" x:Key="Clearcommand" Executed="CommandBinding_Executed_1" CanExecute="CommandBinding_CanExecute_1"/> </Window.Resources> <Border BorderThickness="5" BorderBrush="Orange"> <Grid x:Name="gridroot" Button.Click="gridroot_Click"> <Border BorderThickness="5" BorderBrush="Orange" Width="500" Height="350"> <StackPanel > <TextBox Name="text1"> </TextBox> <TextBox Name="text2" Height="100"></TextBox> <Button Command="New" Name="text" CommandTarget="{Binding ElementName=text3}">触发命令按钮</Button> <Button Content="按钮2" Command="New" /> <Border BorderThickness="5" BorderBrush="Orange" Width="300" Height="250"> <Grid > <Grid.CommandBindings > <!--写以下代码的时候编译器不会提示 --> <StaticResource ResourceKey="Clearcommand"/> </Grid.CommandBindings> <StackPanel> <TextBox Name="text3" Height="50">命令目标</TextBox> <Border BorderThickness="5" BorderBrush="Orange" Width="100" Height="150"> <Grid> <TextBlock TextWrapping="WrapWithOverflow">不能把CommandBinding 放在命令目标范围内 ,那样命令无法正常运行</TextBlock> </Grid> </Border> <Button Content="按钮3" Height="40" /> </StackPanel> </Grid> </Border> </StackPanel> </Border> </Grid> </Border> </Window>
标签:CanExecute,绑定,系统,目标,命令,WPF,commandbing From: https://www.cnblogs.com/cdaniu/p/16594827.html