仅显示特定用户角色的菜单条目

时间:2014-04-25 07:58:10

标签: c# wpf menu visibility role

我想了解如何在XAML代码中为某些用户角色设置可见或隐藏的菜单条目?例如,我有“_MenuEntryForADMIN”,只有用户角色“admin”和“_MenuEntryForAllUsers”才能看到所有用户都可以看到 - 角色“user”。

这是我的XAML代码:

<Grid>
    <DockPanel>
            <MenuItem Header="_MenuEntryForADMIN">
                <MenuItem Header="_Master1" Click="btnMaster1_Click">
                    <MenuItem.Icon>
                        <Image Source="database.png" />
                    </MenuItem.Icon>
                </MenuItem>
                <MenuItem Header="_Master2" Click="btnMaster2_Click">
                    <MenuItem.Icon>
                        <Image Source="database.png" />
                    </MenuItem.Icon>
                </MenuItem>
            </MenuItem>
            <MenuItem Header="_MenuEntryForAllUsers">
                <MenuItem Header="_Normal1" Click="btnNormal1_Click">
                    <MenuItem.Icon>
                        <Image Source="database.png" />
                    </MenuItem.Icon>
                </MenuItem>
                <MenuItem Header="_Normal2" Click="btnNormal2_Click">
                    <MenuItem.Icon>
                        <Image Source="database.png" />
                    </MenuItem.Icon>
                </MenuItem>
            </MenuItem>
        </Menu>
    </DockPanel>
</Grid>

CS-Code包含用户是否具有“admin”或“user”角色的信息:

User userObject;

public MainWindow(User userObject)
{
    InitializeComponent();
    this.userObject = userObject; // this.userObject.Role is "admin" or "user"
}

1 个答案:

答案 0 :(得分:0)

在WPF中,重要的是塑造&#39;在尝试显示之前,将数据放入正确的结构中。这样,我的意思是您应该在显示模型之前过滤视图模型中的MenuItem背后的代码,而不是尝试在UI中过滤它们。

因此,不是在XAML中定义它们,而是创建一些自定义数据类型,以便将数据绑定到您感兴趣的各种MenuItem属性。然后创建一个DataTemplate并将这些属性的集合绑定到MenuItem.ItemsSource属性。您可以从我对Dynamically hiding menu items问题的回答中了解如何执行此操作。简而言之,它看起来像这样:

<DataTemplate x:Key="MenuItemTemplate" DataType="{x:Type MenuItem}">
    <MenuItem Command="{Binding Command}" CommandParameter="{Binding CommandParameter}"
        Header="{Binding Path=Header}" Visibility="{Binding Visible, Converter={
        BooleanToVisibilityConverter}}" ItemsSource="{Binding ChildMenuItems}" />
</DataTemplate>

网上还有许多过滤数据的例子,所以我不会在这里讨论所有这些。你可以在Stack Overflow上的“Hiding” part of List问题中找到一个简短的例子。基本上,您可以使用LinQ仅选择admin MenuItem这样的内容:

ChildMenuItems = new ObservableCollection<YourCustomDataType>(
    FullCollection.Where(i = i.Role == "admin").ToList());