Guide pratique pour établir une liaison à une énumération (WPF .NET)

Cet exemple montre comment établir une liaison à une énumération. Malheureusement, il n’existe pas de moyen direct d’utiliser une énumération comme source de liaison de données. Toutefois, la Enum.GetValues(Type) méthode retourne une collection de valeurs. Ces valeurs peuvent être encapsulées dans une ObjectDataProvider source de données et utilisées comme source de données.

Le ObjectDataProvider type fournit un moyen pratique de créer un objet en XAML et de l’utiliser comme source de données.

Référencer l’énumération

Utilisez le ObjectDataProvider type pour encapsuler un tableau de valeurs d’énumération fournies par le type d’énumération lui-même.

  1. Créez une ObjectDataProvider ressource XAML en tant que ressource XAML, soit dans votre application XAML, soit en XAML de l’objet avec lequel vous travaillez. Cet exemple utilise une fenêtre et crée l’avec ObjectDataProvider une clé de ressource 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>
    

    Dans cet exemple, les trois propriétés permettent ObjectDataProvider de récupérer l’énumération :

    Propriété Description
    ObjectType Type d’objet à renvoyer par le fournisseur de données. Dans cet exemple : System.Enum. L’espace sys: de noms XAML est mappé à System.
    MethodName Nom de la méthode à exécuter sur le System.Enum type. Dans cet exemple : Enum.GetValues.
    MethodParameters Collection de valeurs à fournir à la MethodName méthode. Dans cet exemple, la méthode prend l’énumération System.Type .

    En fait, le code XAML décompose un appel de méthode, un nom de méthode, des paramètres et le type de retour. L’exemple ObjectDataProvider précédent est l’équivalent du code suivant :

    var enumDataSource = System.Enum.GetValues(typeof(System.Windows.HorizontalAlignment));
    
    Dim enumDataSource = System.Enum.GetValues(GetType(System.Windows.HorizontalAlignment))
    
  2. Référencez la ObjectDataProvider ressource. Le code XAML suivant répertorie les valeurs d’énumération dans un ListBox contrôle :

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

XAML complet

Le code XAML suivant représente une fenêtre simple qui effectue les opérations suivantes :

  1. Encapsule l’énumération HorizontalAlignment dans une ObjectDataProvider source de données en tant que ressource.
  2. Fournit un ListBox contrôle pour répertorier toutes les valeurs d’énumération.
  3. Lie la propriété d’un Button HorizontalAlignment contrôle à l’élément sélectionné dans le 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>

Voir aussi