我是一名CM新手,并试图让我的头围绕CM。我正在构建一个应用程序,其中每个选项卡允许用户访问服务器的不同功能,其中所有选项卡中的活动工作(如果有任何活动)可以彼此异步运行,因此shell是“Conductor.Collection.AllActive”我希望是正确的选择。我正在寻找两个方面的建议或样本 -
我希望主shell拥有应用程序菜单和选项卡控件,并根据所选的选项卡更改应用程序菜单项,然后将menuitem单击路由到选项卡的相应VM。< / p>
由于所有选项卡都可能同时执行活动工作,因此我希望有一个示例,说明每个选项卡上的VM如何参与帮助决定(通过对话框向用户)是否可以关闭应用程序单击关闭menuitem或应用程序X图标。或者,如果应该根据用户响应取消关闭(例如,由于存在未保存的文件,他们会说'不')。
非常感谢任何示例和建议。
答案 0 :(得分:1)
我创建了sample可能的方法来执行此操作。使用包含SharedViewModel
集合的MenuItems
。 SharedViewModel
被注入ShellViewModel
和每个TabViewModel
。 Menu控件绑定到MenuItems
。
当标签OnActivate
触发时,TabViewModel
可以更新菜单项。
<HierarchicalDataTemplate DataType="{x:Type viewModels:MenuItemViewModel}"
ItemsSource="{Binding Path=MenuItems}">
<ContentControl cal:View.Model="{Binding}" />
</HierarchicalDataTemplate>
<Menu IsMainMenu="True"
ItemsSource="{Binding SharedViewModel.MenuItems}" />
SharedViewModel:
public class SharedViewModel : PropertyChangedBase
{
private List<MenuItemViewModel> _menuItems;
public List<MenuItemViewModel> MenuItems
{
get { return _menuItems; }
set
{
_menuItems = value;
NotifyOfPropertyChange(() => MenuItems);
}
}
}
更新菜单的TabViewModel示例:
protected override void OnActivate()
{
base.OnActivate();
SharedViewModel.MenuItems = new List<MenuItemViewModel>
{
new MenuItemViewModel
{
Header = "MainMenuItem1",
MenuItems =
new List<MenuItemViewModel>
{
new MenuItemViewModel {Header = "SubMenuItem1"},
new MenuItemViewModel {Header = "SubMenuItem2"},
}
},
new MenuItemViewModel
{
Header = "MainMenuItem2",
MenuItems =
new List<MenuItemViewModel>
{
new MenuItemViewModel {Header = "SubMenuItem1"},
new MenuItemViewModel {Header = "SubMenuItem2"},
}
}
};
}