WPF MVVM -激活viewmodel命令使用热键从主窗口



我有一个MVVM应用程序,其中主窗口包含一个带有多个视图的网格。

在其中一个视图模型中有一个命令,我可以通过在其相应的视图中使用热键来激活它。当我被放置在包含特定视图的主窗口部分时,我只能激活该命令。


如果我只想在特定视图中激活命令,下面的代码可以正常工作:

ComponentView.xaml:

    ...
    <UserControl.InputBindings>
        <KeyBinding Gesture="CTRL+U" Command="{Binding Path=UploadCmd}"/>
    </UserControl.InputBindings>
</UserControl>


我希望能够通过使用主窗口的任何部分的热键来激活该命令。


这是我在主窗口中进行键绑定的失败尝试,以便命令可以从任何地方激活:

MainWindow.xaml:

<Window x:Class="MyProgram.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:view="clr-namespace:MyProgram.View"
        xmlns:vm="clr-namespace:MyProgram.ViewModel"
        ...>
    <Grid>
        // Grid content
    </Grid>
    <Window.DataContext>
        <vm:ComponentViewModel>
            <KeyBinding Gesture="CTRL+U" Command="{Binding Path=UploadCmd}"/>
        </vm:ComponentViewModel>
    </Window.DataContext>
</Window>

是否有可能以某种方式让应用程序知道命令直接在xaml中的位置?

我能想到的三个选项:

  1. 你可以把你的命令放在你的主窗口,然后使用相对源绑定从子视图到你的主窗口中的命令。

    {Binding Path=PathToProperty, RelativeSource={RelativeSource ancestor ={x:Type Window}}}

  2. 如果你正在使用mvvm框架,通常有一种在视图模型之间传递消息/通信的方法。这通常不是最好的解决方案,但可以在适当的情况下使用。

  3. 使用IOC/dependency Injection来创建一个在viewmodellocator中实例化为单例的服务。然后将这个服务实现注入到父视图模型和子视图模型构造器中。然后,你可以从父视图模型调用该服务的函数/属性,这些服务可以被子视图模型访问。

你想用这些命令做什么?

希望能有所帮助

最新更新