8

我目前正在编写的 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;
}

下面的模型代表当前状态,我只是将角色作为列表获取,并通过使用转换器将角色显示为网格视图中的换行符分隔字符串

网格视图的当前状态

然而,这是我想要实现的,以便更轻松地切换和启用各个组的成员资格。

所需的网格视图状态

现在我想了想,我可能不得不更改 Role 的定义以包含一个 IsMember 属性,以方便绑定复选框,但如果有人有更好的方法,我也会欢迎。我可以更改 sproc 中的 JOIN 类型,这样我就可以通过有关特定用户的查询来获取所有角色,并相应地填充 IsMember 属性。

谢谢你的时间!

4

2 回答 2

5

这是我为帮助您入门而编写的一小段代码。我假设您可以在创建应用程序用户时水合类的IsMember属性。Role我采取了最简单的方法,即在所有用户中拥有所有角色(enum flags本来是最好的,但考虑到您的数据,我不确定这是一个没有管道的选项)。我使用最少的列来传达这个想法。如果您INotifyPropertyChanged至少在角色上实现,则可以连接到通知并将其保留回数据库中,当前端的复选框更改时。


主要考试

<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; }
}

结果

截屏

于 2012-07-24T19:01:41.057 回答
2

如果 Roles 列始终显示相同的角色列表,您可以使用从 CheckBox 和 TextBlock 构建的 ItemTemplate 轻松地将 ListView 绑定到所有角色的列表。
然后,您可以轻松地将 CheckBox 的 IsChecked 属性绑定到用户角色,并使用如果角色在用户角色列表中则返回 True 的转换器。

于 2012-07-13T07:30:27.643 回答