如何使用CheckBoxes双向绑定ViewModel?

时间:2012-02-13 17:37:56

标签: c# wpf mvvm checkbox

我有一个用户管理工具,用于编辑用户的权限。我在应用程序中有管理员选择复选框。

权限可能因服务器而异。现在我只有静态复选框和真正的讨厌。

我正在试图弄清楚如何为复选框创建某种动态方案,并跟踪它们何时被选中/取消选中。

当用户选中复选框时,我只能搜索对象并对数据库进行更改。

至少那是我迄今为止想到的方式。有没有人有任何意见或可能是这样的例子?

提前致谢!

4 个答案:

答案 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应包含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 :(得分: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 >