更改菜单和支持关闭“AllActive”选项卡式应用程序的任何示例?

时间:2012-07-01 21:59:04

标签: tabcontrol caliburn.micro

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

  1. 我希望主shell拥有应用程序菜单和选项卡控件,并根据所选的选项卡更改应用程序菜单项,然后将menuitem单击路由到选项卡的相应VM。< / p>

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

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

1 个答案:

答案 0 :(得分:1)

我创建了sample可能的方法来执行此操作。使用包含SharedViewModel集合的MenuItemsSharedViewModel被注入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"},
                                                                }
                                                    }
                                            };
        }