如何将 KeyBinding 的 DataContext 设置为特定的 ViewModel?

How to set the DataContext of a KeyBinding to a specific ViewModel?

这似乎是一个非常基本的问题,但经过几个小时的搜索并没有弄清楚我做错了什么,我决定是时候寻求帮助了!

我是 WPF 和 MVVM 模式的新手,但我正在尝试创建一个包含多个 windows 的应用程序,您可以通过单击按钮进行导航。这是通过让应用程序 window 使用 DataTemplates 显示 UserControls 来实现的,因此当前页面之间没有共享内容(尽管一旦我创建导航区域就会有)。以下是主 window 的 XAML 的样子,目前应用程序中只有一个页面:

<Window x:Class="WPF_Application.ApplicationView"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:WPF_Application"
    Title="ApplicationView" Height="300" Width="300" WindowStartupLocation="CenterScreen" WindowState="Maximized">

<Window.Resources>
    <DataTemplate DataType="{x:Type local:LoginMenuViewModel}">
        <local:LoginMenuView />
    </DataTemplate>
</Window.Resources>


<DockPanel>
    <ContentControl
        Content="{Binding CurrentPageViewModel}" />
</DockPanel>

现在我想做的是添加一个 KeyBinding 来响应按下的退出按钮。完成后 "LogoutCommand" 应该在 LoginMenuViewModel 中触发。我无法获取键绑定来触发 LoginMenuViewModel 中的任何命令,我认为这可能是因为需要将 DataContext 设置为引用 LoginMenuViewModel。对于我的生活,我无法让它工作。

我是否以完全错误的方式处理应用程序范围的命令?是否有一些超级简单的修复方法会让我羞愧地拍打自己的额头?感谢任何见解!

我不知道你的ViewModel代码,所以不容易给你细节提示。 首先,如果你使用的是 MVVM,你应该有自己的 ICommand 接口实现。您可以找到 here 最常见的(还有一个简单的 MVVM 教程)。

拥有自己的命令后 class,您的 ViewModel 应该公开您的 LogoutCommand:

public class ViewModel
{
    /* ... */

    public ICommand LogoutCommand
    {
        get
        {
            return /* your command */
        }
    }

    /* ... */
}

在您后面的代码中,您将设置:DataContext = new ViewModel();,此时您可以声明您需要的 KeyBindings:

<Window.InputBindings>
    <KeyBinding Key="Escape" Command="{Binding Path=LogoutCommand, Mode=OneWay}" />
</Window.InputBindings>

这样,当 Window 处于活动状态并且用户按下 "Esc" 键时,您的 LogoutCommand 将被执行。

这是一个简短的总结,希望能指导您深入了解 MVVM 及其命令系统。