WPF MVVM ListBox.ItemTemplate CheckBox IsChecked绑定

ab_non 发布于 2019-03-09 .net 最后更新 2019-03-09 14:37 0 浏览

我正在处理的场景是编辑角色和权限。在列表框中,我想列出所有已定义的权限并检查已分配选定角色的权限。角色选择发生在一个单独的列表中。 我有一个简单的视图,其中包含一个显示所有权限的列表框:

<ListBox             
    ...
    ItemsSource="{Binding AllPermissions}">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <CheckBox Content="{Binding DisplayName}" 
                      IsChecked="???"/>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>
ItemsSource是一组权限,所选角色的权限是一组不同的组。如何将IsChecked值绑定到集合的交集(即,如果列表框中的权限也在选定角色的权限中,那么该框应该被选中)?
已邀请:

zearum

赞同来自:

我猜你的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);
        }
    }
}
然后将IsIcked绑定到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>

womnis

赞同来自:

我会尝试使用IsChecked绑定的Converter属性。绑定的ConverterParameter将设置为所选角色的权限列表。 我不知道你对ValueConverters有多熟悉,但我可以编写一些代码来说明这是否会有所帮助。 ValueConverter示例很容易在互联网上找到。我第一次实现ValueConverter时,我遵循了this example from David Anson's blog

but

赞同来自:

我会为你的角色编写一个具有权限集合的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>