C# 增强WPF网格视图中特定列的显示

C# 增强WPF网格视图中特定列的显示,c#,wpf,wpfdatagrid,C#,Wpf,Wpfdatagrid,我目前正在编写的WPF应用程序中有一些用户管理功能,我想让最终用户更直观一点 我希望能够提供一些方法来轻松编辑给定用户所属角色的列表。由于绑定到列表 ApplicationUser是我自己的类,定义为: public class ApplicationUser { public Guid? UserId { get; set; } public string GivenName { get; set; } public string Surname

我目前正在编写的WPF应用程序中有一些用户管理功能,我想让最终用户更直观一点

我希望能够提供一些方法来轻松编辑给定用户所属角色的列表。由于绑定到
列表

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; }
}
public class Role
{
   public Guid RoleId;
   public string RoleName;
   public string RoleDescription;
}
下面的模型代表了当前的状态,我只是将角色作为列表获取,通过使用转换器,我只是在gridview中将角色显示为新行分隔的字符串

然而,这正是我想要实现的,以使切换和对各种团体的成员更容易

现在我想了想,我可能不得不修改Role的定义,以包括一个IsMember属性,以便于对复选框进行绑定,但如果有人有更好的方法,我也会欢迎的。我可以在存储过程中更改联接类型,以便通过查询特定用户返回所有角色,并相应地填充IsMember属性


谢谢你的时间

如果“角色”列始终显示相同的角色列表,则可以使用从复选框和文本块构建的ItemTemplate轻松地将ListView绑定到所有角色列表。

然后,您可以轻松地将复选框的IsChecked属性绑定到用户角色,并使用一个转换器,如果该角色在用户角色列表中,该转换器将返回True。

下面是我为您编写的一段简短代码。我假设在创建应用程序用户时,可以使用
角色
类的
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>
<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>


数据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>
<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; }
}
公共类应用程序用户
{
公共Guid?用户ID{get;set;}
公共字符串GivenName{get;set;}
公共字符串姓氏{get;set;}
公共字符串电子邮件地址{get;set;}
公共字符串UserPhone{get;set;}
公共字符串NtLoginName{get;set;}
公共列表应用程序角色{get;set;}
公共应用程序用户()
{
ApplicationRoles=新列表();
}
}
公共阶级角色
{
公共Guid RoleId{get;set;}
公共字符串RoleName{get;set;}
公共字符串角色描述{get;set;}
公共bool IsMember{get;set;}
}

结果


这个问题解决了吗?从下面的答案中我感觉不是&如果你还需要这个,我也许可以帮你。@Maverik-不,从来没有解决过。经过长时间绕道进入应用程序的其他区域后,我今天才重新访问它。我在看Tamir Dresher提出的答案,但如果可以的话,我会与你合作……他的想法是正确的,但从给定的数据来看,它似乎不像他的答案那样直截了当。您的总角色列表是静态的,还是随着时间的推移,随着新角色的添加或旧角色的完全删除(不仅仅是选中或取消选中)而发生变化?管理员可以更改角色并将其保存到数据库中,我有一种方法可以从数据库中获取所有角色。然后我可以(根据下面的建议)在检索时绑定所有角色…完成并清理。第一印象是正确的——这绝对是一个超级答案。非常感谢!