我有一个用户管理工具,用于编辑用户的权限。我在应用程序中有管理员选择复选框。
权限可能因服务器而异。现在我只有静态复选框和真正的讨厌。
我正在试图弄清楚如何为复选框创建某种动态方案,并跟踪它们何时被选中/取消选中。
当用户选中复选框时,我只能搜索对象并对数据库进行更改。
至少那是我迄今为止想到的方式。有没有人有任何意见或可能是这样的例子?
提前致谢!
答案 0 :(得分:3)
只需使用ItemsControl
,将其ItemsSource
绑定到代表权限的VM集合。在ItemTemplate
中,您可以创建CheckBox
,其IsChecked
绑定到项VM上的属性,表示该权限的状态。
然后,您可以从源集合的对象中获取所有状态。
答案 1 :(得分:2)
我们假设有以下用户权限:
[Flags]
public enum UserPermissions
{
Administrator = 0x1,
BackupOperator = 0x2,
PowerUser = 0x4,
User = 0x8,
Guest = 0x10
}
枚举成员应该是绑定到复选框的数据。
好的,ListBox
项目为CheckBox
:
1)CheckBox
类具有布尔IsChecked
属性,但不能直接绑定到标志枚举。
2)ListBox
类具有ItemsSource
属性,可以绑定到集合。
因此,有必要将flags枚举转换为List of flag ViewModels:
1)创建表示单个标志的ViewModel。我们称之为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>
答案 2 :(得分:1)
我没有任何代码,但也许您可以使用一些变体:
创建一组复选框,并根据需要使它们可见/不可见。如果你只有一个最大值,最好是固定金额。
创建一个复选框列表,动态创建它们并设置一个观察者(事件)来监听更改(IsChecked)。
请勿使用复选框,而是使用带有复选框的列表视图或列表框。
答案 3 :(得分: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 >