Предположим, есть следующие разрешения пользователя:
[Flags]
public enum UserPermissions
{
Administrator = 0x1,
BackupOperator = 0x2,
PowerUser = 0x4,
User = 0x8,
Guest = 0x10
}
Члены Enum должны быть привязаны к данным для флажков.
Хорошо, это будет ListBox
с CheckBox
элементами:
1) CheckBox
класс имеет логическое свойство IsChecked
, но его нельзя напрямую связать с перечислением флагов.
2) ListBox
класс имеет свойство ItemsSource
, котороеможет быть привязан к коллекции.
Итак, необходимо преобразовать перечисление флагов в Список флагов 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
, которое будет возвращать перечисление flags с использованием 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>