Tom*_*sup 3 c# data-binding wpf binding mvvm
我想将复选框列表绑定到 WPF 中的枚举值集合。枚举不是 [Flags]。
上下文:用于过滤数据网格,其中每个项目都有一个我的枚举实例。它不一定需要绑定到一个列表,固定大小的集合也可以工作。
假设您想绑定到枚举的所有可能值,您可以使用ObjectDataProvider 来实现。在您的资源(Window.Resources或App.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))并将其公开为数据源。注意:您需要声明命名空间sys和local之前,其中sys是clr-namespace:System;assembly=mscorlib和local是您的枚举的命名空间。
一旦你有了它,你就可以像其他任何东西一样使用该 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)
| 归档时间: |
|
| 查看次数: |
5284 次 |
| 最近记录: |