2

1 つの列挙メンバーを除いて、すべての列挙値を TabControl のタブ項目として表示する必要があります (なし)

enum MyEnum { Value1, Value2, Value3, None }

TabControl には 3 つのタブ (Value1、Value2、および Value3) が表示されます。SelectedItem プロパティにバインドして、ViewModel の現在のタブを取得/設定できるようにする必要があります。各タブのヘッダーは、現在コンバーターを使用してローカライズされた列挙値を使用しています。

これは可能ですか?私は多くのことを試しましたが、うまくいきませんでした。各 TabItem を手動で追加しても問題はありませんが、SelectedItem (タブ) を列挙型にする方法がわかりません。

4

2 に答える 2

1

解決策を見つけました。通常、enum メンバーのリストを取得するには、次のようにします。

<ObjectDataProvider x:Key="SomeEnumValues"
                    MethodName="GetValues" 
                    ObjectType="{x:Type sys:Enum}">
    <ObjectDataProvider.MethodParameters>
        <x:Type TypeName="vm:SomeEnum" />
    </ObjectDataProvider.MethodParameters>
</ObjectDataProvider>

これはすべてのメンバーを取得するため、方法ではありません。列挙値を受け入れ、型からすべてのメンバーを抽出するカスタム コンバーターを作成しました。

// in the convert method
Type type = value.GetType();

List<object> enumValues = new List<object>();

// add each member, except None (has value of 0)
foreach (var field in type.GetFields())
{
    if (field.IsLiteral)
    {
        var x = field.GetValue(null);

        // add new value
        if ((int)x != 0)
            enumValues.Add(field.GetValue(null));
    }
}

ローカライズは ItemTemplate で行われます。そこでは、ローカライズされた値を取得するコンバーター (別のもの) も使用します。

<DataTemplate x:Key="EnumItemTemplate">
    <TextBlock Text="{Binding Mode=OneWay, Converter={StaticResource enumConverter}}"/>
</DataTemplate>
于 2012-06-21T00:16:06.217 に答える
0

率直に言って、あなたがやろうとしていることを行う方法はないと思います。SelectedItem は TabItem オブジェクトになる予定であり、ここでバインド コンバーターを使用して列挙型を使用するようにだます方法はないと思います。たとえそれができたとしても、列挙値の 1 つがバインドしたくないもの (つまり、「なし」) であることを魔法のように認識させる簡単な方法はありません。

最善の策は、各 TabItem の Tag プロパティを必要な列挙型にバインドし、コードを使用して必要な選択効果を実現することです。

于 2012-06-20T23:29:30.940 に答える