WPF MVVM列表框.ItemTemplate CheckBox IsChecked绑定
本文关键字:CheckBox IsChecked 绑定 ItemTemplate MVVM 列表 WPF | 更新日期: 2023-09-27 18:08:46
我正在使用的场景是编辑角色和权限。在一个列表框中,我想列出所有已定义的权限,并检查所选角色已分配的权限。角色选择出现在一个单独的列表中。
我有一个简单的视图,其中包含一个显示所有权限的列表框:
<ListBox
...
ItemsSource="{Binding AllPermissions}">
<ListBox.ItemTemplate>
<DataTemplate>
<CheckBox Content="{Binding DisplayName}"
IsChecked="???"/>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
ItemsSource是一组权限,而所选角色的权限是另一组。我如何将IsChecked值绑定到集合的交集(即,如果ListBox中的Permission也在所选角色的Permissions中,则该框应该被选中)?
我猜你的项目来源的AllPermissions是权限对象的集合。所以要确保除了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);
}
}
}
so then Bind IsChecked to RoleHasPermission.
现在我猜此刻你正在从某处加载可用的权限,他们目前不知道角色是否有权限,所以当你加载AllPermissions时,计算角色是否有权限。
我假设你继承了一个基类,它有一个RaisePropertyChanged事件,当值被更新时通知视图。(如为您提供,如果您使用mvvm light或其他框架,或者您可以编写自己的)另外,如果您希望能够通过选中/取消选中复选框来编辑权限,那么请记住设置绑定模式= two - way:
<ListBox
...
ItemsSource="{Binding AllPermissions}">
<ListBox.ItemTemplate>
<DataTemplate>
<CheckBox Content="{Binding DisplayName}"
IsChecked="{Binding RoleHasPermission, Mode=TwoWay}"/>
</DataTemplate>
</ListBox.ItemTemplate>
我会尝试使用IsChecked绑定的Converter属性。绑定的ConverterParameter将被设置为所选角色的权限列表。
我不知道你对ValueConverters有多熟悉,但如果有帮助的话,我可以写一些代码来说明。ValueConverter的例子很容易在互联网上找到。第一次实现ValueConverter时,我遵循了David Anson博客中的示例。
我会为你的角色写一个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>