1

私はCMの初心者で、CMに頭を悩ませようとしています。私は、各タブでサーバーにアクセスするためのさまざまな機能をユーザーに許可するアプリケーションを構築しています。サーバーにアクセスすると、すべてのタブのアクティブな作業(アクティブな場合)が相互に非同期で実行されるため、シェルは「Conductor.Collection.AllActive」になります。正しい選択だったと思います。私は2つの分野で提案やサンプルを探しています-

  1. メインシェルにアプリケーションメニューとタブコントロールを所有させ、選択したタブに応じてアプリケーションメニュー項目を変更してから、メニュー項目のクリックをタブのそれぞれのVMにルーティングさせたいと思います。

  2. すべてのタブが同時にアクティブな作業を行う可能性があるため、各タブのVMが、メニュー項目またはアプリケーションを閉じるときにアプリケーションを閉じることができるかどうかを(ユーザーへのダイアログを介して)決定するのにどのように参加できるかを示す例を期待しています。 Xアイコンをクリックします。または、ユーザーの応答ごとにクローズをキャンセルする必要がある場合(たとえば、未保存のファイルがあるため、「いいえ」と表示されます)。

どんな例や提案も大歓迎です。

4

1 に答える 1

1

これを行うための可能な方法のサンプルを作成しました。SharedViewModelのコレクションを含むを使用しますMenuItems。と各にSharedViewModel注入されます。Menuコントロールは、のコレクションにバインドされます。ShellViewModelTabViewModelMenuItems

タブが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"},
                                                                }
                                                    }
                                            };
        }
于 2012-07-12T16:44:45.437 に答える