WPF 将枚举列表(或类似列表)绑定到复选框列表

Tom*_*sup 3 c# data-binding wpf binding mvvm

我想将复选框列表绑定到 WPF 中的枚举值集合。枚举不是 [Flags]。

上下文:用于过滤数据网格,其中每个项目都有一个我的枚举实例。它不一定需要绑定到一个列表,固定大小的集合也可以工作。

Bot*_*000 5

假设您想绑定到枚举的所有可能值,您可以使用ObjectDataProvider 来实现。在您的资源(Window.ResourcesApp.Resources等)中声明:

    <ObjectDataProvider x:Key="enumValues" MethodName="GetValues" ObjectType="{x:Type sys:Enum}">
        <ObjectDataProvider.MethodParameters>
            <x:Type TypeName="local:TestEnum"/>
        </ObjectDataProvider.MethodParameters>
    </ObjectDataProvider>
Run Code Online (Sandbox Code Playgroud)

这基本上表示调用Enum.GetValues(typeof(TestEnum))并将其公开为数据源。注意:您需要声明命名空间syslocal之前,其中sysclr-namespace:System;assembly=mscorliblocal是您的枚举的命名空间。

一旦你有了它,你就可以像其他任何东西一样使用该 ObjectDataProvider 作为绑定源,例如:

<ListBox ItemsSource="{Binding Source={StaticResource enumValues}}"/>
Run Code Online (Sandbox Code Playgroud)

这样做的非声明方式只是在代码中分配:

someListBox.ItemsSource = Enum.GetValues(typeof(TestEnum));
Run Code Online (Sandbox Code Playgroud)

不幸的是,为了绑定所选项目,无法从 Xaml 设置 SelectedItems 属性,但您可以使用 SelectionChanged 事件:

<ListBox Name="lb" ItemsSource="{Binding Source={StaticResource enumValues}}" SelectionMode="Multiple" SelectionChanged="lb_SelectionChanged"></ListBox>
Run Code Online (Sandbox Code Playgroud)

然后在事件中在您的 ViewModel(或您使用的任何东西)上设置属性:

private void lb_SelectionChanged(object sender, SelectionChangedEventArgs e) {
    viewModel.SelectedValues = lb.SelectedItems.OfType<TestEnum>().ToList();
}
Run Code Online (Sandbox Code Playgroud)