WPF MVVM ListBox.ItemTemplate CheckBox IsChecked绑定
我正在处理的场景是编辑角色和权限。在列表框中,我想列出所有已定义的权限并检查已分配选定角色的权限。角色选择发生在一个单独的列表中。WPF MVVM ListBox.ItemTemplate CheckBox IsChecked绑定
我有一个包含一个显示所有权限列表框中选择一个简单的观点:
<ListBox
...
ItemsSource="{Binding AllPermissions}">
<ListBox.ItemTemplate>
<DataTemplate>
<CheckBox Content="{Binding DisplayName}"
IsChecked="???"/>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
的的ItemsSource是一组权限和所选择的角色的权限是一组不同的。如何将IsChecked值绑定到集合的交集(即,如果列表框中的权限也在选定角色的权限中,那么该框应该被选中)?
我猜你的AllPermissions的Item源是Permission对象的集合。因此,只要确保除了显示名称,它也有有什么决定了角色是否有权限:
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>
感谢您的评论。我对MVVM和绑定相当陌生。把你的评论放在我读过的其他东西的背景中,我必须更多地充实我的观点模型。 – wilkssh 2013-04-11 17:31:12
我会尝试使用IsChecked的绑定的Converter属性。用于绑定的ConverterParameter将被设置为所选角色的权限列表。
我不知道你对ValueConverters有多熟悉,但我可以写一些代码来说明这是否有帮助。 ValueConverter的例子很容易在互联网上找到。我第一次实施ValueConverter时,我遵循this example from David Anson's blog。
我会写一个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>
你需要一个带有公共布尔IsSelected {get; set;}属性的ViewModel。别忘了'INotifyPropertyChanged'! – 2013-04-11 16:39:32