我目前正在编写的 WPF 应用程序中有一些用户管理功能,并希望它对最终用户来说更直观一些
我希望能够提供某种方式来轻松编辑给定用户所属的角色列表。目前,由于绑定(bind)到 List<ApplicationUser>
,网格被填充。
ApplicationUser
是我自己的类定义为:
public class ApplicationUser
{
public Guid? UserId { get; set; }
public string GivenName { get; set; }
public string Surname { get; set; }
public string EmailAddress { get; set; }
public string UserPhone { get; set; }
public string NtLoginName { get; set; }
public List<Role> ApplicationRoles { get; set; }
}
可以看出,用户所在的角色保存在 List<Role>
中。 . Role
是我自己的类定义为:
public class Role
{
public Guid RoleId;
public string RoleName;
public string RoleDescription;
}
下面的模型表示当前状态,我只是将角色作为列表获取,并通过使用转换器在 gridview 中将角色显示为换行符分隔的字符串
然而,这是我想要实现的,可以更轻松地关闭和打开各个组的成员资格。
考虑到这一点,我可能不得不更改 Role 的定义以包含一个 IsMember 属性,以便于在复选框上进行绑定(bind),但如果有人有更好的方法,我也会欢迎。我可以更改 sproc 中的 JOIN 类型,这样我可以通过有关特定用户的查询返回所有角色,并相应地填充 IsMember 属性。
感谢您的宝贵时间!
最佳答案
这是我为帮助您入门而编写的一小段代码。我假设您可以在创建应用程序用户时合并 Role
类的 IsMember
属性。我采取了最简单的方法,即在所有用户中拥有所有角色(enum flags
本来是最好的,但考虑到您的数据,我不确定这是一个没有管道的选项)。我使用最少的专栏来传达这个想法。如果您至少在角色上实现了 INotifyPropertyChanged
,您可以连接到通知并在前端的复选框发生更改时将其持久保存回数据库。
主 Xaml
<DataGrid DataContext="{StaticResource ResourceKey=AllUsers}" ItemsSource="{Binding}" AutoGenerateColumns="False">
<DataGrid.Columns>
<DataGridTextColumn Binding="{Binding GivenName}" />
<DataGridTextColumn Binding="{Binding Surname}" />
<DataGridTemplateColumn>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ItemsControl ItemsSource="{Binding ApplicationRoles}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<CheckBox Content="{Binding RoleName}" IsChecked="{Binding IsMember, Mode=TwoWay}" />
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
数据 Xaml
<x:Array x:Key="AllUsers" Type="Sample:ApplicationUser">
<Sample:ApplicationUser GivenName="Andrew" Surname="Fuller">
<Sample:ApplicationUser.ApplicationRoles>
<Sample:Role RoleName="Administrators" IsMember="True"/>
<Sample:Role RoleName="Shift Analysts"/>
<Sample:Role RoleName="Shift Managers" IsMember="True"/>
</Sample:ApplicationUser.ApplicationRoles>
</Sample:ApplicationUser>
<Sample:ApplicationUser GivenName="Anne" Surname="Dodsworth">
<Sample:ApplicationUser.ApplicationRoles>
<Sample:Role RoleName="Administrators"/>
<Sample:Role RoleName="Shift Analysts" IsMember="True"/>
<Sample:Role RoleName="Shift Managers" IsMember="True"/>
</Sample:ApplicationUser.ApplicationRoles>
</Sample:ApplicationUser>
</x:Array>
类定义
public class ApplicationUser
{
public Guid? UserId { get; set; }
public string GivenName { get; set; }
public string Surname { get; set; }
public string EmailAddress { get; set; }
public string UserPhone { get; set; }
public string NtLoginName { get; set; }
public List<Role> ApplicationRoles { get; set; }
public ApplicationUser()
{
ApplicationRoles = new List<Role>();
}
}
public class Role
{
public Guid RoleId { get; set; }
public string RoleName { get; set; }
public string RoleDescription { get; set; }
public bool IsMember { get; set; }
}
结果
关于c# - 增强 WPF GridView 中特定列的显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10853659/