我正在编写的WPF应用程序中有一些用户管理功能,并且希望让最终用户更直观
我希望能够提供某种方法来轻松编辑给定用户所属的角色列表。此时网格由于绑定到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;
}
下面的模型代表当前状态,我只是将角色作为List获取,并且通过使用转换器只在gridview中将角色显示为换行符号的新行
然而,这是我想要实现的目标,以便更容易地切换各个组的成员资格。
现在我想起来我可能不得不改变角色的定义以包含一个IsMember属性来促进对复选框的绑定,但如果有人有更好的方法我也会欢迎它。我可以在sproc中更改JOIN类型,以便通过查询特定用户来获取所有角色并相应地填充IsMember属性。
谢谢你的时间!
答案 0 :(得分:5)
以下是我为帮助您入门而编写的一小段代码。我假设您在创建应用程序用户时可以保留IsMember
类的Role
属性。我已经采取了最简单的方法,让所有用户中的所有角色(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; }
}
<强>结果强>
答案 1 :(得分:2)
如果Roles列始终显示相同的角色列表,则可以使用从CheckBox和TextBlock构建的ItemTemplate轻松地将ListView绑定到所有角色的列表。
然后,您可以轻松地将CheckBox的IsChecked属性绑定到用户角色,并使用如果角色位于用户角色列表中则返回True的转换器。