【问题标题】:Show menu entries only for certain user roles仅为某些用户角色显示菜单条目
【发布时间】:2014-06-10 19:53:51
【问题描述】:

我想了解如何在 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 包含用户是否具有“管理员”或“用户”角色的信息,如下所示:

User userObject;

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

【问题讨论】:

    标签: c# wpf menu visibility role


    【解决方案1】:

    在 WPF 中,重要的是在尝试显示数据之前将数据“塑造”成正确的结构。我的意思是,您应该在显示它们之前在您的视图模型或代码中过滤数据,您的MenuItems,而不是尝试在 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 只选择管理员 MenuItems,如下所示:

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

    【讨论】:

      猜你喜欢
      • 2017-08-02
      • 1970-01-01
      • 1970-01-01
      • 2011-02-23
      • 1970-01-01
      • 1970-01-01
      • 2021-02-02
      • 2011-03-17
      • 2018-09-06
      相关资源
      最近更新 更多