注意:我使用 MVVM Light Toolkit 和 MahApps.Metro
所以我的应用程序中有一个HamburgerMenu
控件,它在HamburgerMenuImageItem
中包含HamburgerMenuItemCollection
个。
我想要做的是隐藏一个项目并根据用户的登录情况显示另一个项目。我拥有所有信息,我知道用户是谁以及他/她是否可以看到选项卡,但我不知道如何隐藏选项卡。
<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
且不允许看到本地标签,则会隐藏本地标签。
答案 0 :(得分:3)
您可以在XAML标记中提供HamburgerMenuImageItem
x: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);
}
}
}
答案 1 :(得分:1)
我想我找到了解决方案。我已经将一个Loaded EventHandler附加到HamburgerMenu:
<controls:HamburgerMenu [...] Loaded="HamburgerMenuLoaded" />
并在后面的代码中:
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中的属性是一个名为ShowTab
的bool,我将其用于绑定。