次の方法で共有


列挙型にバインドする方法

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

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

列挙型を参照する

ObjectDataProvider 型を使用して、列挙型自体によって提供される列挙値の配列をラップします。 次の手順では、 HorizontalAlignment 列挙体をラップします。 必要に応じて、別の列挙体を置き換えることができます。

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

    この例では、ObjectDataProvider は 3 つのプロパティを使用して列挙体を取得します。

    プロパティ 説明
    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>

こちらも参照ください