2

列挙型メンバーのリストを取得するための ObjectDataProvider があります。

<ObjectDataProvider x:Key="GetEnumContents" MethodName="GetValues" ObjectType="{x:Type System:Enum}">
    <ObjectDataProvider.MethodParameters>
         <x:Type TypeName="Data:Status"/>
    </ObjectDataProvider.MethodParameters>
</ObjectDataProvider>

次に使用します:

<ComboBox SelectedItem="{Binding Status, UpdateSourceTrigger=PropertyChanged}" ItemsSource="{Binding Source={StaticResource GetEnumContents}}" />

同じウィンドウで、別の列挙型のコンボ ボックスが必要です。ComboBox 宣言から列挙型を渡すにはどうすればよいですか?

次のような同様の問題の解決策を見てきました。

Path="MethodParameters[0]"

しかし、ここではパラメーターを何にもバインドしたくありません。ComboBox 宣言でハードコーディングしたいだけです。

何か案は?

4

1 に答える 1

2

ObjectDataProviderはそのような機能をサポートしていませんが、 と を巧妙に悪用して「偽造」することができますBindingIValueConverter

まず、IValueConverter:

class EnumConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return Enum.GetValues((Type)parameter);
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

使用方法は次のとおりです。

<Window
    x:Class="EnumTest.MainWindow"
    [...snip...]
    xmlns:local="clr-namespace:EnumTest"
    Title="MainWindow"
    Width="800"
    Height="450"
    mc:Ignorable="d">
    <Window.Resources>
        <local:EnumConverter x:Key="EnumConverter" />
    </Window.Resources>
    <StackPanel>
        <ComboBox ItemsSource="{Binding Converter={StaticResource EnumConverter}, ConverterParameter={x:Type local:MyEnum1}}" />
        <ComboBox ItemsSource="{Binding Converter={StaticResource EnumConverter}, ConverterParameter={x:Type local:MyEnum2}}" />
    </StackPanel>
</Window>

いくつかのテスト列挙型:

enum MyEnum1
{
    Red,
    Green,
    Blue,
}

enum MyEnum2
{
    Cat,
    Dog,
    Fish,
    Bird,
}

これにより、次の出力が生成されます。 ここに画像の説明を入力 ここに画像の説明を入力

これは、追加のパラメーターを に渡すことができるという事実を利用していますIValueConverter。これを使用してType、列挙型の をコンバーターに渡します。コンバーターはEnum.GetNamesその引数を呼び出すだけで、結果を返します。actualは、実際には のBindingが何であれバインドされます。喜んでそれを無視し、代わりにパラメーターを操作します。DataContextComboBoxEnumConverter


アップデート

ConverterParameter次のように、型に直接バインドし、完全にスキップすることで、さらにうまく機能します。

<ComboBox ItemsSource="{Binding Source={x:Type local:MyEnum1}, Converter={StaticResource EnumConverter}}" />

コンバーターを調整すると:

public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
    return Enum.GetValues((Type)value);
}

タイピングが少なく、理解しやすいコードで同じ結果が得られます。

于 2018-10-29T17:22:22.823 に答える