我有一个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中的位置?
我能想到的三个选项:
-
你可以把你的命令放在你的主窗口,然后使用相对源绑定从子视图到你的主窗口中的命令。
{Binding Path=PathToProperty, RelativeSource={RelativeSource ancestor ={x:Type Window}}}
-
如果你正在使用mvvm框架,通常有一种在视图模型之间传递消息/通信的方法。这通常不是最好的解决方案,但可以在适当的情况下使用。
-
使用IOC/dependency Injection来创建一个在viewmodellocator中实例化为单例的服务。然后将这个服务实现注入到父视图模型和子视图模型构造器中。然后,你可以从父视图模型调用该服务的函数/属性,这些服务可以被子视图模型访问。
你想用这些命令做什么?
希望能有所帮助