WPF Mahapps - 如何在汉堡菜单集合中隐藏选项卡?

4
注意:我正在使用MVVM Light Toolkit和MahApps.Metro
因此,我的应用程序中有一个HamburgerMenu控件,它包含在HamburgerMenuItemCollection中的HamburgerMenuImageItems。我想要做的是根据用户登录情况隐藏一个选项并显示另一个选项。我拥有所有信息,知道用户是谁以及他/她是否允许查看选项卡,但我不知道如何隐藏选项卡。
<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>

我认为其中还有一些代码与显示内容的数据模板无关。

我不确定是否可能,但是假设User已登录,而又不能查看本地选项卡,则会隐藏本地选项卡。

enter image description here

2个回答

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

像往常一样,mm8来拯救了。 :) 另外,你认为有没有一种MVVM的方式来完成这个任务?毕竟,我所做的一切(好吧,95%的事情)都是在ViewModel中完成的。 - TheITDejan
既然你正在视图中创建HamburgerMenuImageItem,那么也可以将其从视图中删除。MVVM的方式是绑定到在视图模型中定义的(数据)项集合,然后在视图中为每个数据类型定义模板。 - mm8
我明白了 :) 我稍后会尝试使用MVVM。再次感谢! - TheITDejan

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的布尔值,我正在使用它进行绑定。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接