c# - 增强 WPF GridView 中特定列的显示

标签 c# wpf wpfdatagrid

我目前正在编写的 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 中将角色显示为换行符分隔的字符串

Current state of gridview

然而,这是我想要实现的,可以更轻松地关闭和打开各个组的成员资格。

Desired state of 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; }
}

结果

Screenshot

关于c# - 增强 WPF GridView 中特定列的显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10853659/

相关文章:

wpf - 如何防止 WPF Toolkit DataGrid 中的行选择?

WPF 4 ContentPresenter TextWrapping 样式不适用于隐式生成的 TextBlock

wpf - 如何在 WPF Datagrid 的第一列中显示行号

c# - 在 .net 中,我应该使用什么类来轻松处理数据库中的数据(不包括 Entity Framework 或 LINQ)

c# - 如何将 EntityFramework、Repository、UnitOfWork 和 Automapper 结合到一个 MVC 应用程序中?

c# - 删除空格验证 ASP 控件

c# - 如何在可移植库中反序列化 JSON

wpf - 属性不存在 : System. Windows.Interactivity?

c# - WPF TextBox 绑定(bind)到 StringBuilder 以模拟控制台性能

wpf - 如何访问数据网格模板列文本框文本 WPF C#