1

我是一名 CM 新手,并试图了解 CM。我正在构建一个应用程序,其中每个选项卡允许用户访问服务器的不同功能,其中所有选项卡中的活动工作(如果有的话是活动的)可以彼此异步运行,因此外壳是“Conductor.Collection.AllActive”我希望是正确的选择。我正在寻找两个方面的建议或样本 -

  1. 我想让主外壳拥有应用程序菜单和选项卡控件,并根据所选选项卡更改应用程序菜单项,然后将菜单项单击路由到选项卡的相应 VM。

  2. 由于所有选项卡都可能同时进行活动工作,因此我希望提供一个示例,说明每个选项卡上的虚拟机如何参与帮助决定(通过与用户的对话)如果关闭菜单项或应用程序是否可以关闭应用程序单击 X 图标。或者是否应该根据用户响应取消关闭(例如,由于有未保存的文件,他们说“不”)。

非常感谢任何示例和建议。

4

1 回答 1

1

我创建了一个可能的方法来做到这一点的样本。使用SharedViewModel包含MenuItems. 被SharedViewModel注入ShellViewModel和 eachTabViewModel中。Menu 控件绑定到MenuItems.

When a tab's OnActivatefires the Menu items can be updated by the TabViewModel.

<HierarchicalDataTemplate DataType="{x:Type viewModels:MenuItemViewModel}"
                                  ItemsSource="{Binding Path=MenuItems}">
            <ContentControl cal:View.Model="{Binding}" />
        </HierarchicalDataTemplate>

  <Menu IsMainMenu="True"
              ItemsSource="{Binding SharedViewModel.MenuItems}" />

共享视图模型:

 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"},
                                                                }
                                                    }
                                            };
        }
于 2012-07-12T16:44:45.437 回答