2013-04-11 401 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>