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少なくともロールに実装する場合は、通知に接続して、フロントエンドのチェックボックスが変更されたときにデータベースに永続化することができます。


メイン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; }
}

結果

スクリーンショット

于 2012-07-24T19:01:41.057 に答える
2

[役割]列に常に同じ役割のリストが表示される場合は、CheckBoxとTextBlockから作成されたItemTemplateを使用して、ListViewをすべての役割のリストに簡単にバインドできます。
次に、CheckBoxのIsCheckedプロパティをユーザーロールに簡単にバインドし、ロールがユーザーロールリストにある場合にTrueを返すコンバーターを使用できます。

于 2012-07-13T07:30:27.643 に答える