2

私が取り組んでいるシナリオは、役割と権限の編集です。リスト ボックスに、定義されたすべてのアクセス許可を一覧表示し、選択したロールが割り当てられているアクセス許可を確認します。ロールの選択は別のリストで行われます。

すべての権限を表示するリスト ボックスを含む単純なビューがあります。

<ListBox             
    ...
    ItemsSource="{Binding AllPermissions}">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <CheckBox Content="{Binding DisplayName}" 
                      IsChecked="???"/>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

ItemsSource は権限の 1 つのセットであり、選択されたロールの権限は別のセットです。IsChecked 値をセットの交点にバインドするにはどうすればよいですか (つまり、ListBox のアクセス許可が選択したロールのアクセス許可にもある場合は、ボックスをオンにする必要があります)。

4

3 に答える 3

1

AllPermissions の Item ソースは Permission オブジェクトのコレクションだと思います。したがって、DisplayName に加えて、役割に権限があるかどうかを決定する何かがあることを確認してください。

public class Permission : ViewModelBase
{
    private string displayName;
    private bool roleHasPermission;

    public string DisplayName
    {
        get
        {
            return this.displayName;
        }
        set
        {
            this.displayName = value;
            this.RaisePropertyChanged(() => this.DisplayName);
        }
    }

    public bool RoleHasPermission
    {
        get
        {
            return this.roleHasPermission;
        }
        set
        {
            this.roleHasPermission = value;
            this.RaisePropertyChanged(() => this.RoleHasPermission);
        }
    }
}

IsChecked を RoleHasPermission にバインドします。

現時点では、利用可能なアクセス許可をどこかから読み込んでいて、ロールにアクセス許可があるかどうかを現在認識していないため、AllPermissions を読み込んでいるときに、ロールにアクセス許可があるかどうかを計算していると推測しています。

値が更新されたときにビューに通知するために、RaisePropertyChanged イベントを持つ基本クラスから継承したと仮定しました。(mvvm light やその他のフレームワークを使用する場合に提供されるもの、または独自に作成できるものなど) また、チェック ボックスをオン/オフしてアクセス許可を編集できるようにする場合は、バインディング Mode=TwoWay を設定することを忘れないでください。すなわち:

<ListBox             
...
ItemsSource="{Binding AllPermissions}">
<ListBox.ItemTemplate>
    <DataTemplate>
        <CheckBox Content="{Binding DisplayName}" 
                  IsChecked="{Binding RoleHasPermission, Mode=TwoWay}"/>
    </DataTemplate>
</ListBox.ItemTemplate>

于 2013-04-11T17:04:38.087 に答える