【问题标题】:Setting WPF commands from multiple view models从多个视图模型设置 WPF 命令
【发布时间】:2010-05-06 18:11:48
【问题描述】:

与任何 MVVM WPF 应用程序一样,我有一些视图模型。每个都有一些命令。我的视图实现了 Fluent UI(Office 功能区),因此有一些项目会根据应用程序的上下文亮起。功能区是主应用程序的子项。

我的应用程序的基本结构是它管理一个课程。一个课程中有多个模块,所以我有一个用于课程和模块的虚拟机......每个都有命令。

当应用程序加载时,我将主窗口的数据上下文设置为课程,因此将课程命令绑定到功能区很容易并且工作正常。

当用户开始使用模块时,挑战就来了。当从列表中选择一个模块时,详细信息将显示在另一个用户控件中。现在...我的挑战是如何将命令连接到功能区。

我假设我可以有一些事件处理程序,以编程方式将当前模块的命令连接到功能区中的所有相关控件,并在上下文消失时删除所有内容。但这似乎是很多不必要的工作。有没有更清洁的方法?

我考虑过路由命令/事件,但有人告诉我这行不通,因为它们不会一直冒泡到窗口并返回到功能区。

在这里寻找一些指导...我对 MVVM 有点陌生(但喜欢它!)。

【问题讨论】:

    标签: wpf ribbon mvvm


    【解决方案1】:

    想法:引入一个作为服务公开的 ShellCommands 类。

    public class ShellCommands : IShellCommands
    {
        public ICommand SaveCommand { get; set; }
        ...
    }
    

    那么 CourseViewModel 和 ModuleViewModel 可以使用相同的服务来注册他们的命令。

    public class CourseViewModel : ViewModel 
    {
        public CourseViewModel(IShellCommands shellCommands, ...)
        {
            this.ShellCommands = shellCommands;
            ...
        }
    
        public IShellCommands ShellCommands { get; private set; }
    }
    

    在 XAML 中,您可以通过 ShellCommands 属性访问服务。

    <MenuItem Header="Save" Command="{Binding ShellCommands.SaveCommand}"/>
    

    .

    更多信息: WPF Application Framework (WAF)

    【讨论】:

    • 有趣的想法...尝试实现它,看看它是如何工作的。我在 MainWindow 类上创建了 ShellCommands 对象类和公共属性(因为当应用程序加载时,它会创建 CourseViewModel 的实例并将其绑定到 DataContext。然后我将 ShellCommands 属性传递给 CourseViewModel。但是当我绑定它到一个按钮,命令没有触发。在创建 CourseViewModel 后设置断点后,我可以看到该命令已被连接,但它不会触发......没有此方法会触发相同的命令(所以 CanExecute作品)。想法?
    • 刮掉最后一条评论...我把它连接到 CourseViewModel 上的一个命令。但是在下游,我创建了具有自己命令的 ModuleViewModel 实例。问题是主窗口上的 ShellCommand 属性没有使用这些新命令进行更新,因为它们是 ModuleViewModel 的新实例。似乎这将是人们经常遇到的挑战。是否没有普遍接受的技术来解决它(或者我只是以错误的方式解决这个问题)?
    • 当我理解您的评论时,您只需要在 ShellCommands 上实现 INotifyPropertyChanged 接口。当 ModuleViewModel 设置命令时,ShellCommands 对象会引发 PropertyChanged 事件并通知 WPF 它必须更新主窗口中的命令绑定。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-05-01
    • 2019-08-06
    • 2010-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-23
    相关资源
    最近更新 更多