Compartir a través de


Cómo enlazar a una enumeración (WPF .NET)

En este ejemplo se muestra cómo enlazar a una enumeración. Desafortunadamente, no hay una manera directa de usar una enumeración como origen de enlace de datos. Sin embargo, el método Enum.GetValues(Type) devuelve una colección de valores. Estos valores se pueden encapsular en ObjectDataProvider y usarse como origen de datos.

El tipo ObjectDataProvider proporciona una manera cómoda de crear un objeto en XAML y usarlo como origen de datos.

Importante

La documentación de la guía de escritorio para .NET 7 y .NET 6 está en proceso de elaboración.

Hacer referencia a la enumeración

Use el tipo ObjectDataProvider para encapsular una matriz de valores de enumeración proporcionados por el propio tipo de enumeración.

  1. Cree un nuevo ObjectDataProvider como un recurso XAML, ya sea en el XAML de la aplicación o en el XAML del objeto con el que está trabajando. En este ejemplo se usa una ventana y se crea el ObjectDataProvider con una clave de recurso de EnumDataSource.

    <Window.Resources>
        <ObjectDataProvider x:Key="EnumDataSource"
                            ObjectType="{x:Type sys:Enum}"
                            MethodName="GetValues">
            <ObjectDataProvider.MethodParameters>
                <x:Type TypeName="HorizontalAlignment" />
            </ObjectDataProvider.MethodParameters>
        </ObjectDataProvider>
    </Window.Resources>
    

    En este ejemplo el ObjectDataProvider usa tres propiedades para recuperar la enumeración:

    Propiedad Descripción
    ObjectType El tipo de objeto que va a devolver el proveedor de datos. En este ejemplo, System.Enum. El espacio de nombres XAML sys: se asigna a System.
    MethodName El nombre del método que se ejecutará en el tipo System.Enum. En este ejemplo, Enum.GetValues.
    MethodParameters Una colección de valores que se proporcionarán al método MethodName. En este ejemplo el método toma el System.Type de la enumeración.

    De hecho, XAML está desglosando una llamada al método, el nombre del método, los parámetros y el tipo de valor devuelto. El ObjectDataProvider configurado en el ejemplo anterior es el equivalente del código siguiente:

    var enumDataSource = System.Enum.GetValues(typeof(System.Windows.HorizontalAlignment));
    
    Dim enumDataSource = System.Enum.GetValues(GetType(System.Windows.HorizontalAlignment))
    
  2. Haga referencia al recurso ObjectDataProvider. En el código XAML siguiente se enumeran los valores de enumeración de un control ListBox:

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

XAML completo

El código XAML siguiente representa una ventana sencilla que hace lo siguiente:

  1. Encapsula la enumeración HorizontalAlignment en un origen de datos ObjectDataProvider como un recurso.
  2. Proporciona un control ListBox para enumerar todos los valores de enumeración.
  3. Enlaza la propiedad HorizontalAlignment de un control Button al elemento seleccionado en el 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>

Vea también