2

我正在使用的场景是编辑角色和权限。在列表框中,我想列出所有已定义的权限并检查已分配所选角色的权限。角色选择出现在单独的列表中。

我有一个简单的视图,其中包含一个显示所有权限的列表框:

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

ItemsSource 是一组权限,而所选角色的权限是另一组。如何将 IsChecked 值绑定到集合的交集(即,如果 ListBox 中的 Permission 也在所选角色的 Permissions 中,则应选中该框)?

4

3 回答 3

1

我猜你的 AllPermissions 项目来源是 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 IE:

<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 回答
0

我会尝试使用 IsChecked 绑定的 Converter 属性。绑定的 ConverterParameter 将设置为所选角色的权限列表。

我不知道您对 ValueConverters 有多熟悉,但我可以编写一些代码来说明这是否有帮助。ValueConverter 示例很容易在 Internet 上找到。我第一次实现 ValueConverter 时,是按照David Anson 的博客中的这个示例进行的

于 2013-04-11T16:52:42.860 回答
0

我会为您的角色编写一个具有权限集合的 ViewModel。

public class PermissionViewModel : ViewModelBase
{
    public string Name { get; set; }
    public bool HasPermission { get; set; }
}

public class RoleViewModel : ViewModelBase
{
    public string Name { get; set; }
    public ObservableCollection<PermissionViewModel> PermissionViewModels { get; set; }
}

<ListBox             
...
ItemsSource="{Binding SelectedRoleViewModel.PermissionViewModels}">
<ListBox.ItemTemplate>
    <DataTemplate>
        <CheckBox Content="{Binding Name}" 
                  IsChecked="{Binding HasPermission, Mode=TwoWay}"/>
    </DataTemplate>
</ListBox.ItemTemplate>
于 2013-04-11T17:25:06.993 回答