如何将 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 及其命令系统。
这似乎是一个非常基本的问题,但经过几个小时的搜索并没有弄清楚我做错了什么,我决定是时候寻求帮助了!
我是 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 及其命令系统。