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

时间:2012-06-01 16:00:07

标签: c# wpf wpfdatagrid

我正在编写的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中将角色显示为换行符号的新行

Current state of gridview

然而,这是我想要实现的目标,以便更容易地切换各个组的成员资格。

Desired state of gridview

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

谢谢你的时间!

2 个答案:

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

<强>结果

Screenshot

答案 1 :(得分:2)

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