【问题标题】:WPF MVVM - Activate ViewModel-command by use of hot keys from MainWindowWPF MVVM - 使用 MainWindow 中的热键激活 ViewModel 命令
【发布时间】:2013-05-04 02:58:21
【问题描述】:

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

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

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

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 中的直接位置?

【问题讨论】:

    标签: wpf xaml mvvm datacontext key-bindings


    【解决方案1】:

    我能想到的三个选项:

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

      {绑定路径=PathToProperty,RelativeSource={RelativeSource AncestorType={x:Type Window}}}

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

    3. 使用 IOC / Dependecy Injection 创建一个在视图模型定位器中实例化为单例的服务。然后将此服务实现注入到父视图模型和子视图模型构造函数中。然后,您可以从子视图模型可以访问的父视图模型中调用该服务的函数/属性。我将其用于导航目的。

    你想用这些命令做什么?

    希望对你有帮助

    【讨论】:

    • 我对 WPF 或 MVVM 不是很有经验。我不熟悉 IOC/依赖注入。我最终添加了一个包含新命令的 MainWindowViewModel。我绑定到 MainWindow.xaml 中的新命令。当命令被执行时,它们会发布一个事件。网格中的不同视图模型订阅这些事件,然后执行仍然放置在原始视图模型中的原始命令。我已经让它工作了,但我可以从你的回答中看出,这可能不是最好的解决方案。谢谢你的建议! :)
    • 很高兴为您提供帮助。我会研究 mvvm light 来学习 mvvm。我使用它是因为它很简单,让我以良好的学习曲线学习 mvvm 的原理。谷歌galasoft mvvm light,你会找到的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-01
    • 1970-01-01
    • 2018-09-20
    • 1970-01-01
    • 2010-10-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多