2017-04-24 49 views
2

注:私はMVVMライトツールキットを使用していMahApps.MetroWPF Mahapps - ハンバーガーメニューコレクション内のタブを隠すには?

だから私は自分のアプリケーション内HamburgerMenuコントロールを持っている、それがHamburgerMenuItemCollectionHamburgerMenuImageItem Sが含まれています。 私がしたいのは、どのユーザーがログインしているかによって1つのアイテムを非表示にして別のものを表示することです。私はすべての情報を持っています。そのユーザーは誰ですか、そしてそのタブを表示することは許されていますか?どのようにタブを非表示にするかわからない。

<controls:HamburgerMenu> 
    <controls:HamburgerMenu.ItemsSource> 
     <controls:HamburgerMenuItemCollection> 
       <controls:HamburgerMenuImageItem Label="Global"> 
        <controls:HamburgerMenuImageItem.Thumbnail> 
         <BitmapImage UriSource="../../Resources/Icons/test.png" /> 
        </controls:HamburgerMenuImageItem.Thumbnail> 
        <controls:HamburgerMenuImageItem.Tag> 
         <views:GlobalView /> 
        </controls:HamburgerMenuImageItem.Tag> 
       </controls:HamburgerMenuImageItem> 

       <controls:HamburgerMenuImageItem Label="Local"> 
        <controls:HamburgerMenuImageItem.Thumbnail> 
         <BitmapImage UriSource="../../Resources/Icons/test.png" /> 
        </controls:HamburgerMenuImageItem.Thumbnail> 
        <controls:HamburgerMenuImageItem.Tag> 
         <views:LocalView /> 
        </controls:HamburgerMenuImageItem.Tag> 
       </controls:HamburgerMenuImageItem> 
     </controls:HamburgerMenuItemCollection> 
    </controls:HamburgerMenu.ItemsSource> 
</controls:HamburgerMenu> 

私はそれが関連性がないと思うほどのコードがあります(コンテンツを表示するためのDataTemplates)。

可能かどうかわかりませんが、Userにログインしてローカルタブを表示できない場合は、ローカルタブは表示されません。

enter image description here

答えて

1

あなたは自分のXAMLマークアップでHamburgerMenuImageItemx:Nameを与え、あなたのビューのコードビハインドでプログラムを削除できます。

<controls:HamburgerMenu x:Name="menu"> 
    <controls:HamburgerMenu.ItemsSource> 
     <controls:HamburgerMenuItemCollection> 
      ... 
      <controls:HamburgerMenuImageItem Label="Local" x:Name="local"> 
       ... 
      </controls:HamburgerMenuImageItem> 
     </controls:HamburgerMenuItemCollection> 
    </controls:HamburgerMenu.ItemsSource> 
</controls:HamburgerMenu> 

public partial class MainWindow : MetroWindow 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 

     if(/* user is logged in...*/) 
     { 
      HamburgerMenuItemCollection itemCollection = menu.ItemsSource as HamburgerMenuItemCollection; 
      itemCollection.Remove(local); 
     } 
    } 
} 
+0

通常通り、mm8を救助します。 :) また、MVVM形式でこれを行う方法があると思いますか?結局のところ、私がやったことのすべて(まあ、95%)は、ViewModelで行われています。 – Desomph

+0

さて、ビューでHamburgerMenuImageItemを作成しているので、ビューからも削除することができます。 MVVMの方法では、ビューモデルで定義した(データ)アイテムのコレクションにバインドし、ビュー内の各データタイプのテンプレートを定義することになります。 – mm8

+0

私はそれを得る:) 私はMVVMをやってみるつもりです。再度、感謝します! – Desomph

1

は私が考えます解決策が見つかりました。ブール値Iが結合のために使用していますShowTab、呼ばれ

private void HamburgerMenuLoaded(object sender, RoutedEventArgs e) 
{ 
    if (sender is HamburgerMenu hamburgerMenu) 
    { 
     if (hamburgerMenu.Template.FindName("ButtonsListView", hamburgerMenu) is ListBox listBox) 
     { 
      var style = new Style(typeof(ListBoxItem)) 
         { 
          BasedOn = listBox.ItemContainerStyle 
         }; 

      style.Triggers.Add(new DataTrigger 
           { 
            Binding = new Binding(nameof(ITabViewModel.ShowTab)), 
            Value = false, 
            Setters = 
            { 
             new Setter(VisibilityProperty, Visibility.Collapsed) 
            } 
           }); 

      listBox.ItemContainerStyle = style; 
     } 
    } 
} 

プロパティ私のViewModelで:

<controls:HamburgerMenu [...] Loaded="HamburgerMenuLoaded" /> 

と背後にあるコードで:私はHamburgerMenuにロードのEventHandlerを添付しました。

関連する問題