如何获取输入键命令的发件人



我有此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>

最新更新