我有此XAML代码:
<Window.InputBindings>
<KeyBinding Command="{Binding Path=KeyEnterCommand}" Key="Enter" />
</Window.InputBindings>
这就是我的ViewModel中的代码:
private RelayCommand _keyEnterCommand;
public ICommand KeyEnterCommand
{
get
{
if (_keyEnterCommand == null)
{
_keyEnterCommand = new RelayCommand(param => ExecuteKeyEnterCommand());
}
return _keyEnterCommand;
}
}
public void ExecuteKeyEnterCommand()
{
// Do magic
}
现在是我的问题,如何获得此命令的发件人?
如果是"发送者",则是指按下键时焦点的元素,然后您可以将当前集中的元素作为参数传递给命令,例如:
<Window x:Class="MyWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Name="root">
<Window.InputBindings>
<KeyBinding Command="{Binding Path=KeyEnterCommand}"
CommandParameter="{Binding ElementName=root, Path=(FocusManager.FocusedElement)}"
Key="Escape" />
</Window.InputBindings>
...
private RelayCommand<object> _keyEnterCommand;
public ICommand KeyEnterCommand
{
get
{
if (_keyEnterCommand == null)
{
_keyEnterCommand = new RelayCommand<object>(ExecuteKeyEnterCommand);
}
return _keyEnterCommand;
}
}
public void ExecuteKeyEnterCommand(object sender)
{
// Do magic
}
您还可以使用commandtarget属性。这是一个略有不同的用法,因为它使用了WPF随附的预定义命令。但是,我不确定是否可以/如何与从ICommand继承的类一起使用。
wpf.2000things.com上的一篇文章说:
路由命令的来源是正在调用的元素 命令。执行或canececute处理程序中的发件人参数 是拥有事件处理程序的对象。设置命令 按钮的参数到特定命令,然后绑定 命令在主窗口中的命令键键中的某些代码, 按钮是源,窗口是发件人。
设置命令属性时,您还可以设置命令图 属性,表明应将其视为的不同元素 路由命令的来源。
在下面的示例中,查找命令现在似乎源自文本框。我们可以在执行事件的事件处理程序中看到这一点:
<Window x:Class="WpfApplication1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Commands" Width="320" Height="220">
<Window.CommandBindings>
<CommandBinding Command="ApplicationCommands.Find"
CanExecute="Find_CanExecute"
Executed="Find_Executed"/>
</Window.CommandBindings>
<StackPanel>
<TextBox Name="txtSomeText"
Width="140" Height="25" Margin="10"/>
<Button Content="Find"
Command="ApplicationCommands.Find"
CommandTarget="{Binding ElementName=txtSomeText}"
Margin="10" Padding="10,3"
HorizontalAlignment="Center" />
</StackPanel>
</Window>