如何绑定到枚举 (WPF .NET)

此示例演示如何绑定到枚举。 遗憾的是,没有直接方法可以将枚举用作数据绑定源。 但是,Enum.GetValues(Type) 方法可返回值的集合。 这些值可以包装在 ObjectDataProvider 中并用作数据源。

ObjectDataProvider 类型提供了一种在 XAML 中创建对象并将其用作数据源的便捷方式。

引用枚举

使用 ObjectDataProvider 类型包装枚举类型本身提供的枚举值数组。

  1. 在应用程序 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.Enumsys: 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))
    
  2. 引用 ObjectDataProvider 资源。 以下 XAML 列出了 ListBox 控件中的枚举值:

    <ListBox Name="myComboBox" SelectedIndex="0"
             ItemsSource="{Binding Source={StaticResource EnumDataSource}}"/>
    

完整 XAML

以下 XAML 代码表示执行以下操作的简单窗口:

  1. ObjectDataProvider 数据源中的 HorizontalAlignment 枚举包装为资源。
  2. 提供一个 ListBox 控件以列出所有枚举值。
  3. 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>

另请参阅