0

私は自分のアプリケーション (および私の学習曲線) で、ComboBox を介して GUI でエンティティのプロパティを設定する必要があるポイントに無邪気に到達しました。具体的には、PersonフォームにはGenderフィールドがあり、このフィールドは、ユーザーが、およびオプションComboBoxを選択できる場所である必要があります。MaleFemaleUnspecified

もちろん、この ComboBoxは、 ViewModelのGenderプロパティにTwoWay データ バインドする必要があります。Person

ええと、私は最初に「明らかに、列挙型を作成し、その列挙型をGenderプロパティとComboBoxデータソースのいずれかの基礎として使用して、列挙型自体を変更しても変更する必要さえない」と考えましたPersonクラスまたはフォーム XAML のいずれかです。

問題は、私が説明したような単純であるべき使用法を実装するすべてのが、ヘルパークラス、 s、 s などenumを使用して、かなりゆがんでいることです。「単純でなければならない」部分を考えると、それは非常に奇妙に思えます...ValueConverterObjectProvider

したがって、質問は次のとおりです。

  • 「WPF DESIGNED の ComboBox は、そもそも Enums で使用するために設計されたものでしたか? それとも、この明白な選択は実際には、物事を必要以上に複雑にする人為的な制約ですか?」
  • 「WPF の ComboBox は、Enum を使用しない場合、どのように使用する必要がありますか。一連の値を ViewModel プロパティにバインドする双方向データバインディングの明らかな適用に関して、標準的な使用方法は何ですか?」

読んでくれてありがとう。


IEnumerable ではなく Dictionary に変換された Sheridan の回答に続く最終的なコード:

SelectedPerson.Genderプロパティを含み、Genderenum が使用可能な名前空間にある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方法で問題ありません。

4

3 に答える 3

2

enumインスタンスを WPF のコレクション コントロールの項目として使用することはまったく問題ありません。以下に簡単な例を示します。

public enum Gender
{
    Male, Female
} 

private ObservableCollection<Gender> genders = new ObservableCollection<Gender>() 
    { Gender.Male, Gender.Female };

public ObservableCollection<Gender> Genders
{
    get { return genders; }
    set { genders = value; NotifyPropertyChanged("Genders"); }
}

private Gender selectedGender = Gender.Female;

public Gender SelectedGender
{
    get { return selectedGender; }
    set { selectedGender = value; NotifyPropertyChanged("SelectedGender"); }
}

<ComboBox ItemsSource="{Binding Genders}" SelectedItem="{Binding SelectedGender}" />

ここで、SelectedGenderプロパティを「エンティティ」からのプロパティに置き換えることができます。そうすれば、ComboBox選択を設定すると、エンティティのそのプロパティが更新されます。

更新 >>>

申し訳ありませんが、その小さな詳細を見落としていたに違いありません...Enum.GetValues列挙値を反復処理する目的でメソッドを使用できます。

Array values = Enum.GetValues(typeof(Gender));
Genders = new ObservableCollection<Gender>(values.OfType<Gender>());

SelectedItemビューモデルにバインドされているプロパティに関して、プロパティを「エンティティ」プロパティに置き換えることができると言いました。これがどのように行われるかは、データ型とビュー モデル クラスをどのように設定したかによって異なりますが、のようになると思います。SelectedGender

あなたのビューモデルで:

private ObservableCollection<Gender> genders = new ObservableCollection<Gender>();

public ObservableCollection<Gender> Genders
{
    get { return genders; }
    set { genders = value; NotifyPropertyChanged("Genders"); }
}

private YourDataObjectType yourDataObject = new YourDataObjectType();

public YourDataObjectType YourDataObject 
{
    get { return yourDataObject; }
    set { yourDataObject = value; NotifyPropertyChanged("YourDataObject"); }
}

次に、XAML で:

<ComboBox ItemsSource="{Binding Genders}" 
    SelectedItem="{Binding YourDataObject.YourGenderProperty}" />
于 2013-10-14T13:51:23.543 に答える
1

ほとんどの場合、wpf でコンボボックスを使用するときは、ディクショナリ エントリの値の部分が表示されるユーザーフレンドリーなテキスト (DisplayMember) であり、キー値がビューモデルにバインドされている項目ソースとしてディクショナリを持っています。

于 2013-10-14T13:51:23.650 に答える