2013-04-11 148 views
2

我正在处理的场景是编辑角色和权限。在列表框中,我想列出所有已定义的权限并检查已分配选定角色的权限。角色选择发生在一个单独的列表中。WPF MVVM ListBox.ItemTemplate CheckBox IsChecked绑定

我有一个包含一个显示所有权限列表框中选择一个简单的观点:

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

的的ItemsSource是一组权限和所选择的角色的权限是一组不同的。如何将IsChecked值绑定到集合的交集(即,如果列表框中的权限也在选定角色的权限中,那么该框应该被选中)?

+1

你需要一个带有公共布尔IsSelected {get; set;}属性的ViewModel。别忘了'INotifyPropertyChanged'! – 2013-04-11 16:39:32

回答

0

我猜你的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> 

+0

感谢您的评论。我对MVVM和绑定相当陌生。把你的评论放在我读过的其他东西的背景中,我必须更多地充实我的观点模型。 – wilkssh 2013-04-11 17:31:12

0

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

我不知道你对ValueConverters有多熟悉,但我可以写一些代码来说明这是否有帮助。 ValueConverter的例子很容易在互联网上找到。我第一次实施ValueConverter时,我遵循this example from David Anson's blog

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>