列挙型にバインドする方法 (WPF .NET)

この例では、列挙型にバインドする方法を示します。 残念ながら、列挙型をデータ バインディング ソースとして使用する直接的な方法はありません。 ただし、Enum.GetValues(Type) メソッドは、値のコレクションを返します。 これらの値は ObjectDataProvider でラップして、データ ソースとして使用できます。

ObjectDataProvider 型は、XAML でオブジェクトを作成し、データ ソースとして使用する便利な方法を提供します。

重要

.NET 7 と .NET 6 用のデスクトップ ガイド ドキュメントは作成中です。

列挙型を参照する

ObjectDataProvider 型を使用して、列挙型自体によって提供される列挙値の配列をラップします。

  1. アプリケーション XAML または使用しているオブジェクトの XAML のいずれかで、XAML リソースとして新しい ObjectDataProvider を作成します。 この例では、ウィンドウを使用して、リソース キー 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 は 3 つのプロパティを使用して列挙型を取得します。

    プロパティ Description
    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))
    
  2. ObjectDataProvider リソースを参照します。 次の XAML は、ListBox コントロールの列挙値を一覧表示します。

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

完全な XAML

次の XAML コードは、次のことを実行する単純なウィンドウを表します。

  1. HorizontalAlignment 列挙型をリソースとして ObjectDataProvider データ ソースにラップします。
  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>

関連項目