私は自分のアプリケーション (および私の学習曲線) で、ComboBox を介して GUI でエンティティのプロパティを設定する必要があるポイントに無邪気に到達しました。具体的には、Person
フォームにはGender
フィールドがあり、このフィールドは、ユーザーが、およびオプションComboBox
を選択できる場所である必要があります。Male
Female
Unspecified
もちろん、この ComboBoxは、 ViewModelのGender
プロパティにTwoWay データ バインドする必要があります。Person
ええと、私は最初に「明らかに、列挙型を作成し、その列挙型をGender
プロパティとComboBox
データソースのいずれかの基礎として使用して、列挙型自体を変更しても変更する必要さえない」と考えましたPerson
クラスまたはフォーム XAML のいずれかです。
問題は、私が説明したような単純であるべき使用法を実装するすべての例が、ヘルパークラス、 s、 s などenum
を使用して、かなりゆがんでいることです。「単純でなければならない」部分を考えると、それは非常に奇妙に思えます...ValueConverter
ObjectProvider
したがって、質問は次のとおりです。
- 「WPF DESIGNED の ComboBox は、そもそも Enums で使用するために設計されたものでしたか? それとも、この明白な選択は実際には、物事を必要以上に複雑にする人為的な制約ですか?」
- 「WPF の ComboBox は、Enum を使用しない場合、どのように使用する必要がありますか。一連の値を ViewModel プロパティにバインドする双方向データバインディングの明らかな適用に関して、標準的な使用方法は何ですか?」
読んでくれてありがとう。
IEnumerable ではなく Dictionary に変換された Sheridan の回答に続く最終的なコード:
SelectedPerson.Gender
プロパティを含み、Gender
enum が使用可能な名前空間にあるViewModel では、次のようになります。
// this won't be set, so only getter needed, I think
// Using dictionary as a placeholder for i18n implementation.
public Dictionary<Gender, String> Genders {
get { return new Dictionary<Gender,string> {
{Gender.Unspecified, "Não especificado"},
{Gender.Female, "Feminino"},
{Gender.Male, "Masculino"}
};
}
}
XAML では次のようになります。
<ComboBox
ItemsSource="{Binding Genders}"
DisplayMemberPath="Value"
SelectedValuePath="Key"
SelectedValue="{Binding SelectedPerson.Gender, Mode=TwoWay}"/>
一方、これは質問で述べた「列挙型が変更された場合、クラスを変更する必要はありません」に違反しますが、表示名と i18n がある場合は、とにかく変更する必要があるため、「ものを更新する必要があります。とにかく列挙型が変更された場合。しかし、列挙型は頻繁に変更されることは想定されていません。
もちろん、表示名が必要ない場合は、そのEnum.GetNames
方法で問題ありません。