与任何MVVM WPF应用程序一样,我有一些视图模型。每个都有一些命令。我的视图实现了一个Fluent UI(Office功能区),因此有些项目会根据应用程序的上下文点亮。功能区是主要应用程序的子项。
我的应用程序的基本结构是它管理一个课程。一个课程里面有多个模块,所以我有一个VM课程和课程。模块......每个都有命令。
当应用程序加载时,我将主窗口的数据上下文设置为课程,因此将课程命令绑定到功能区很容易,并且工作正常。
当用户开始使用模块时,就会遇到挑战。从列表中选择模块时,详细信息显示在另一个用户控件中。现在......我的挑战是如何将命令连接到功能区。
我假设我可以使用一些事件处理程序,以编程方式将当前模块的命令连接到功能区中的所有相关控件,并在上下文消失时删除所有内容。但这似乎是很多不必要的工作。有没有更简洁的方法呢?
我考虑过路由的命令/事件,但是有人告诉我这不会起作用,因为它们不会将所有内容冒泡到窗口并返回到功能区。
在这里寻找一些指导......我对MVVM来说是一个菜鸟(但是喜欢它!)。
答案 0 :(得分:4)
想法:介绍一个作为服务公开的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}"/>