我想了解如何在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"
}
答案 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());