我正在使用的方案是编辑角色和权限。在列表框中,我想列出所有已定义的权限,并检查已分配所选角色的权限。角色选择发生在单独的列表中。
我有一个简单的视图,其中包含一个显示所有权限的列表框:
<ListBox
...
ItemsSource="{Binding AllPermissions}">
<ListBox.ItemTemplate>
<DataTemplate>
<CheckBox Content="{Binding DisplayName}"
IsChecked="???"/>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
ItemsSource是一组权限,所选角色的权限是另一组。如何将IsChecked值绑定到集合的交集(即,如果ListBox中的权限也在所选角色的权限中,那么应该选中该框)?
答案 0 :(得分: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>
答案 1 :(得分:0)
我会尝试使用IsChecked绑定的Converter属性。用于绑定的ConverterParameter将设置为所选角色的权限列表。
我不知道你对ValueConverters有多熟悉,但我可以编写一些代码来说明这是否会有所帮助。 ValueConverter示例很容易在互联网上找到。我第一次实现ValueConverter时,我跟着this example from David Anson's blog。
答案 2 :(得分: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>