我有一個用戶管理工具,可以爲用戶編輯權限。我在應用程序中有管理員選擇複選框。如何雙向綁定ViewModel與CheckBoxes?
權限可能因服務器而異。現在我只有靜態複選框和它的真正討厭。
我想弄清楚如何爲複選框創建某種動態方案並跟蹤它們何時被選中/取消選中。
當用戶選擇複選框時,我可以搜索對象並對數據庫進行更改。
至少這是我迄今爲止的想法。有沒有人有任何輸入或可能是這樣的事情的例子?
在此先感謝!
我有一個用戶管理工具,可以爲用戶編輯權限。我在應用程序中有管理員選擇複選框。如何雙向綁定ViewModel與CheckBoxes?
權限可能因服務器而異。現在我只有靜態複選框和它的真正討厭。
我想弄清楚如何爲複選框創建某種動態方案並跟蹤它們何時被選中/取消選中。
當用戶選擇複選框時,我可以搜索對象並對數據庫進行更改。
至少這是我迄今爲止的想法。有沒有人有任何輸入或可能是這樣的事情的例子?
在此先感謝!
只需使用ItemsControl
,將其ItemsSource
綁定到表示權限的VM集合。在ItemTemplate
中,您可以創建一個CheckBox
,它的IsChecked
綁定到您的項目虛擬機上的一個屬性,該屬性表示該權限的狀態。
然後您可以從源集合的對象中獲取所有狀態。
我沒有任何代碼,但也許一些變化,你可以使用:
創建一組的複選框,並使其可見/不可見,你需要他們。最好如果你只有一個最大值。固定值。
創建一個複選框列表,動態創建它們並設置一個觀察者(事件)來監聽更改(IsChecked)。
不要使用複選框,而要使用帶複選框的列表視圖或列表框。
假設有以下用戶權限:
[Flags]
public enum UserPermissions
{
Administrator = 0x1,
BackupOperator = 0x2,
PowerUser = 0x4,
User = 0x8,
Guest = 0x10
}
枚舉成員應該是綁定到複選框的數據。
好吧,這將是ListBox
與CheckBox
項目:
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
財產將返回標誌枚舉使用IsChecked
UserPermissionViewModel
實例的屬性值。
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
應該包含CheckBox
和TextBlock
作爲ItemTemplate
。將它們相應地綁定到IsChecked
和Permission
屬性。
之後,綁定應該工作,結果可以使用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>
我不會推薦一個'ListBox',因爲它引入了不需要的選擇,一個普通的'ItemsControl'應該做的。 – 2012-02-13 20:04:11
一個例子是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 >
查看關於Serge的回答的評論。 – 2012-02-13 20:05:30
你當然是對的。 – Phil 2012-02-13 21:05:32
+1,我建議類似的方法,但更詳細。 – 2012-02-13 20:01:54
花了我一點時間來實施,但再次感謝H.B. – rreeves 2012-02-15 00:52:15
@BatMasterson:不客氣,很高興它幫助:) – 2012-02-15 01:15:50