Как двустороннее связывание ViewModel с CheckBoxes? - PullRequest
1 голос
/ 13 февраля 2012

У меня есть инструмент администратора, который редактирует разрешения для пользователей.У меня в приложении есть флажки для выбора администратора.

Разрешения могут отличаться для разных серверов.Прямо сейчас у меня есть только статические флажки и это очень неприятно.

Я пытаюсь выяснить, как создать какую-то динамическую схему для флажков и отследить, когда они были отмечены / сняты.

Когда пользователь выбирает флажки, я могу просто искать объект и вносить изменения в базу данных.

Ну, по крайней мере, я так думал об этом до сих пор.У кого-нибудь есть вход или, может быть, пример чего-то подобного в действии?

Заранее спасибо!

Ответы [ 4 ]

3 голосов
/ 13 февраля 2012

Просто используйте ItemsControl, свяжите его ItemsSource с набором виртуальных машин, которые представляют разрешение. В ItemTemplate вы можете создать CheckBox, чей IsChecked связан со свойством на виртуальной машине вашего элемента, которое представляет состояние этого разрешения.

Затем вы можете получить все состояния из объектов исходной коллекции.

2 голосов
/ 13 февраля 2012

Предположим, есть следующие разрешения пользователя:

[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>
1 голос
/ 14 февраля 2012

Пример того, что 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 >
1 голос
/ 13 февраля 2012

У меня нет кода, но, возможно, вы можете использовать несколько вариантов:

  • Создайте набор флажков и сделайте их видимыми / невидимыми по мере необходимости. Желательно, если у вас есть только макс. фиксированная сумма.

  • Создайте список флажков, создайте их динамически и установите наблюдателя (событие) для прослушивания изменений (IsChecked).

  • Не используйте чекбоксы, но используйте список или список с чекбоксами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...