2017-04-24 4 views
2

참고 : 나는 MVVM 라이트 툴킷MahApps.MetroWPF Mahapps - 햄버거 메뉴 컬렉션 내에서 탭을 숨기는 방법?

을 사용하고 그래서 난 내 응용 프로그램 내 HamburgerMenu 제어, 그것은 HamburgerMenuItemCollectionHamburgerMenuImageItem의이 포함되어 있습니다. 내가하고 싶은 것은 한 사용자를 숨기고 어떤 사용자가 로그인했는지에 따라 다른 항목을 표시하는 것입니다. 나는 모든 정보를 가지고 있으며, 사용자가 누구인지, 탭을 볼 수 있는지 여부는 알고 있지만 어떻게 탭을 숨길 지 모르겠다.

<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 방식으로이 작업을 수행 할 수있는 방법이 있다고 생각합니까? 결국 ViewModel에서 수행 한 모든 작업 (음, 95 %)이 완료되었습니다. – Desomph

+0

글쎄, 당신이보기에서 HamburgerMenuImageItem을 만들고 있기 때문에 뷰에서 그것을 제거 할 수도 있습니다. MVVM 방식은 뷰 모델에서 정의한 (데이터) 항목 컬렉션에 바인딩 한 다음 뷰의 각 데이터 유형에 대한 템플릿을 정의하는 것입니다. – mm8

+0

나는 그것을 얻는다 : 나는 그것을 나중에 MVVM하려고 노력할 것이다. 다시 한 번 감사드립니다! – Desomph

1

가 내가 생각 해결책을 찾았습니다.

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

을 뒤에 코드에서 : 나는 HamburgerMenu에로드 이벤트 핸들러를 첨부했습니다

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; 
     } 
    } 
} 

내 뷰 모델의 속성은 내가 바인딩을 위해 사용하고 ShowTab라는 부울입니다 .