在WPF中创建密钥绑定

41zrol4v  于 2023-10-22  发布在  其他
关注(0)|答案(5)|浏览(125)

我需要为Window创建输入绑定。

public class MainWindow : Window
{
    public MainWindow()
    {
        SomeCommand = ??? () => OnAction();
    }

    public ICommand SomeCommand { get; private set; }

    public void OnAction()
    {
        SomeControl.DoSomething();
    }
}
<Window>
    <Window.InputBindings>
        <KeyBinding Command="{Binding SomeCommand}" Key="F5"></KeyBinding>
    </Window.InputBindings>
</Window>

如果我用CustomCommand : ICommand初始化SomeCommand,它不会被触发。SomeCommand属性getter永远不会被调用。

rhfm7lfc

rhfm7lfc1#

对于您的情况,最好的方法是使用MVVM模式
XAML:

<Window>
    <Window.InputBindings>
        <KeyBinding Command="{Binding SomeCommand}" Key="F5"/>
    </Window.InputBindings>
</Window>

后面的代码:

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
    }
}

在视图模型中:

public class MyViewModel
{
    private ICommand someCommand;
    public ICommand SomeCommand
    {
        get
        {
            return someCommand 
                ?? (someCommand = new ActionCommand(() =>
                {
                    MessageBox.Show("SomeCommand");
                }));
        }
    }
}

然后你需要一个ICommand的实现。这是一个简单而有用的类。

public class ActionCommand : ICommand
{
    private readonly Action _action;

    public ActionCommand(Action action)
    {
        _action = action;
    }

    public void Execute(object parameter)
    {
        _action();
    }

    public bool CanExecute(object parameter)
    {
        return true;
    }

    public event EventHandler CanExecuteChanged;
}
omtl5h9j

omtl5h9j2#

对于修改器(组合键):

<KeyBinding Command="{Binding SaveCommand}" Modifiers="Control" Key="S"/>
pnwntuvh

pnwntuvh3#

这可能为时已晚,但这是最简单和最短的解决方案。

private void Window_KeyDown(object sender, KeyEventArgs e)
{
    if (Keyboard.Modifiers == ModifierKeys.Control && e.Key == Key.S)
    {
         // Call your method here
    }
}

<Window x:Class="Test.MainWindow" KeyDown="Window_KeyDown" >
lndjwyie

lndjwyie4#

您必须创建自己的Command实现ICommand接口,并使用该Command的示例初始化SomeCommand
现在你必须将Window的DataContext设置为self,以使CommandBinding工作:

public MainWindow()
{
    InitializeComponents();
    DataContext = this;
    SomeCommand = MyCommand() => OnAction();
}

或者您必须将Binding更新为

<Window>
   <Window.InputBindings>
    <KeyBinding Command="{Binding SomeCommand, RelativeSource={RelativeSource Self}}" Key="F5"></KeyBinding>
   </Window.InputBindings>
 </Window>
dly7yett

dly7yett5#

通常,命令不应该存在于视图中;它应该存在于视图模型中。但是,在某些罕见的情况下,在视图中包含命令可能是有意义的。在这种情况下,确实不清楚如何将键绑定连接到命令,正如OP所发现的那样。
这是我在项目中解决这个问题的方法:

<Window x:Class="MyNamespace.MyView"
    (...)
    xmlns:local="clr-namespace:MyNameSpace"
    (...)
    <Grid>
        <Grid.InputBindings>
            <KeyBinding Key="R" Command="{Binding ReportCommand, 
                RelativeSource={RelativeSource AncestorType=local:MyView}}" />
    (...)

ReportCommandMyView中的ICommand,* 不是ViewModel中的 *。

相关问题