如何绑定到枚举 (WPF .NET)
此示例演示如何绑定到枚举。 遗憾的是,没有直接方法可以将枚举用作数据绑定源。 但是,Enum.GetValues(Type) 方法可返回值的集合。 这些值可以包装在 ObjectDataProvider 中并用作数据源。
ObjectDataProvider 类型提供了一种在 XAML 中创建对象并将其用作数据源的便捷方式。
引用枚举
使用 ObjectDataProvider 类型包装枚举类型本身提供的枚举值数组。
在应用程序 XAML 或正在使用的对象的 XAML 中创建一个新的
ObjectDataProvider
作为 XAML 资源。 此示例使用一个窗口并使用资源键EnumDataSource
创建ObjectDataProvider
。<Window.Resources> <ObjectDataProvider x:Key="EnumDataSource" ObjectType="{x:Type sys:Enum}" MethodName="GetValues"> <ObjectDataProvider.MethodParameters> <x:Type TypeName="HorizontalAlignment" /> </ObjectDataProvider.MethodParameters> </ObjectDataProvider> </Window.Resources>
在此示例中,
ObjectDataProvider
使用三个属性来检索枚举:properties 说明 ObjectType
数据提供程序要返回的对象类型。 在本示例中为 System.Enum。 sys:
XAML 命名空间映射到System
。MethodName
要在 System.Enum
类型上运行的方法的名称。 在本示例中为 Enum.GetValues。MethodParameters
要提供给 MethodName
方法的值的集合。 在此示例中,该方法采用枚举的System.Type
。实际上,XAML 正在分解方法调用、方法名称、参数和返回类型。 上一示例中配置的
ObjectDataProvider
等效于以下代码:var enumDataSource = System.Enum.GetValues(typeof(System.Windows.HorizontalAlignment));
Dim enumDataSource = System.Enum.GetValues(GetType(System.Windows.HorizontalAlignment))
引用
ObjectDataProvider
资源。 以下 XAML 列出了 ListBox 控件中的枚举值:<ListBox Name="myComboBox" SelectedIndex="0" ItemsSource="{Binding Source={StaticResource EnumDataSource}}"/>
完整 XAML
以下 XAML 代码表示执行以下操作的简单窗口:
- 将 ObjectDataProvider 数据源中的 HorizontalAlignment 枚举包装为资源。
- 提供一个 ListBox 控件以列出所有枚举值。
- 将 Button 控件的 HorizontalAlignment 属性绑定到
ListBox
中的选定项。
<Window x:Class="ArticleExample.BindEnumFull"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:sys="clr-namespace:System;assembly=mscorlib"
SizeToContent="WidthAndHeight"
Title="Enum binding">
<Window.Resources>
<ObjectDataProvider x:Key="EnumDataSource"
ObjectType="{x:Type sys:Enum}"
MethodName="GetValues">
<ObjectDataProvider.MethodParameters>
<x:Type TypeName="HorizontalAlignment" />
</ObjectDataProvider.MethodParameters>
</ObjectDataProvider>
</Window.Resources>
<StackPanel Width="300" Margin="10">
<TextBlock>Choose the HorizontalAlignment value of the Button:</TextBlock>
<ListBox Name="myComboBox" SelectedIndex="0"
ItemsSource="{Binding Source={StaticResource EnumDataSource}}"/>
<Button Content="I'm a button"
HorizontalAlignment="{Binding ElementName=myComboBox, Path=SelectedItem}" />
</StackPanel>
</Window>