2012-02-13 59 views
1

我有一個用戶管理工具,可以爲用戶編輯權限。我在應用程序中有管理員選擇複選框。如何雙向綁定ViewModel與CheckBoxes?

權限可能因服務器而異。現在我只有靜態複選框和它的真正討厭。

我想弄清楚如何爲複選框創建某種動態方案並跟蹤它們何時被選中/取消選中。

當用戶選擇複選框時,我可以搜索對象並對數據庫進行更改。

至少這是我迄今爲止的想法。有沒有人有任何輸入或可能是這樣的事情的例子?

在此先感謝!

回答

3

只需使用ItemsControl,將其ItemsSource綁定到表示權限的VM集合。在ItemTemplate中,您可以創建一個CheckBox,它的IsChecked綁定到您的項目虛擬機上的一個屬性,該屬性表示該權限的狀態。

然後您可以從源集合的對象中獲取所有狀態。

+0

+1,我建議類似的方法,但更詳細。 – 2012-02-13 20:01:54

+0

花了我一點時間來實施,但再次感謝H.B. – rreeves 2012-02-15 00:52:15

+0

@BatMasterson:不客氣,很高興它幫助:) – 2012-02-15 01:15:50

1

我沒有任何代碼,但也許一些變化,你可以使用:

  • 創建一組的複選框,並使其可見/不可見,你需要他們。最好如果你只有一個最大值。固定值。

  • 創建一個複選框列表,動態創建它們並設置一個觀察者(事件)來監聽更改(IsChecked)。

  • 不要使用複選框,而要使用帶複選框的列表視圖或列表框。

2

假設有以下用戶權限:

[Flags] 
public enum UserPermissions 
{ 
    Administrator = 0x1, 
    BackupOperator = 0x2, 
    PowerUser = 0x4, 
    User = 0x8, 
    Guest = 0x10 
} 

枚舉成員應該是綁定到複選框的數據。

好吧,這將是ListBoxCheckBox項目:

1)CheckBox類有布爾IsChecked屬性,但它不能直接綁定到標誌枚舉。

2)ListBox類有ItemsSource屬性可以綁定到集合。

因此,有必要標誌枚舉列表標誌的ViewModels的轉換:

1)創建視圖模型表示標誌。我們稱之爲UserPermissionViewModel類。它應該有IsChecked布爾值和單個枚舉標誌值Permission屬性。

public class UserPermissionViewModel : ViewModelBase 
{ 
    public UserPermissionViewModel(UserPermissions permission, bool isSet) 
    { 
     Permission = permission; 
     IsSet = isSet; 
    } 

    public UserPermissions Permission { get; private set; } 

    public bool IsSet { get; set; } 
} 

2)爲所有標誌創建ViewModel(包含許多UserPermissionViewModel類的實例)。我們稱之爲UserPermissionsViewModel類。此ViewModel應該在構造函數中使用源枚舉並將其轉換爲其旗標表示的內部集合:集合UserPermissionViewModel實例。還應該有Result財產將返回標誌枚舉使用IsCheckedUserPermissionViewModel實例的屬性值。

public class UserPermissionsViewModel 
{ 
    public UserPermissionsViewModel(UserPermissions permissions) 
    { 
     // Convert each flag of UserPermissions enum to UserPermissionViewModel and pass IsSet (true) if the permissions has the flag. 
     Permissions = allPermissions.Select(singlePermission => new UserPermissionViewModel(singlePermission, permissions.HasFlag(singlePermission))).ToList(); 
    } 

    public List<UserPermissionViewModel> Permissions 
    { 
     get; 
     private set; 
    } 

    public UserPermissions Result 
    { 
     get 
     { 
      // Iterate over Permissions list and get result flags enum. 
     } 
    } 

3)在視圖中創建ListBox,它綁定到UserPermissionsViewModel類的權限列表屬性。 ListBox應該包含CheckBoxTextBlock作爲ItemTemplate。將它們相應地綁定到IsCheckedPermission屬性。

之後,綁定應該工作,結果可以使用Result屬性。

<ListBox ItemsSource="{Binding Path=PermissionsViewModel.Permissions}"> 
    <ListBox.ItemTemplate> 
    <DataTemplate> 
     <WrapPanel> 
     <CheckBox IsChecked="{Binding Path=IsSet}" /> 
     <TextBlock VerticalAlignment="Center" Text="{Binding Path=Permission}" /> 
     </WrapPanel> 
    </DataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 
+2

我不會推薦一個'ListBox',因爲它引入了不需要的選擇,一個普通的'ItemsControl'應該做的。 – 2012-02-13 20:04:11

1

一個例子是H.B.上面說:

<ItemsControl ItemsSource="{Binding Privileges}"> 
     <ItemsControl .ItemTemplate> 
      <DataTemplate DataType="{x:Type Privilege}"> 
       <StackPanel> 
        <TextBlock Text="{Binding Name}"/> 
        <CheckBox IsChecked="{Binding IsEnabled}"/> 
       </StackPanel> 
      </DataTemplate> 
     </ItemsControl .ItemTemplate> 
    </ItemsControl > 
+0

查看關於Serge的回答的評論。 – 2012-02-13 20:05:30

+0

你當然是對的。 – Phil 2012-02-13 21:05:32