web-dev-qa-db-ja.com

ComboBox SelectedItem vs SelectedValue

次のコードは期待どおりに機能します。モデルのMyPropertyは、ユーザーがドロップダウンで新しいアイテムを選択すると更新されます。

comboBox1.DataBindings.Add("SelectedValue", myModel, "MyProperty", true,
DataSourceUpdateMode.OnPropertyChanged);

ただし、次は同じ方法では機能せず、入力フォーカスがフォーム上の別のコントロールに移動するまでモデルの更新はトリガーされません。

comboBox1.DataBindings.Add("SelectedItem", myModel, "MyProperty", true, 
DataSourceUpdateMode.OnPropertyChanged);

誰かが理由を知っていますか?原因の調査をどこから開始すればよいかさえわかりません。調査を開始するための正しい方向へのポインタまたは明確な説明も同様に歓迎されます。

:私の目的のために、SelectedItemSelectedValueの両方にバインドすることになりました。この方法で、UIの変更に基づいて(SelectedValueバインディングを介して)モデルの更新を即座に取得し、プログラムによるモデルの変更に基づいて(SelectedItemバインディングを介して)UIの更新を取得します。

47
Adam Lear

ComboBox コントロールは ListControl コントロールから継承します。

SelectedItem プロパティは、ComboBoxコントロールの適切なメンバーです。変更時に発生するイベントは ComboBox.SelectionChangeCommitted

ComboBox.SelectionChangeCommitted

選択した項目が変更され、その変更がComboBoxに表示されると発生します。

SelectedValue プロパティは、ListControlコントロールから継承されます。そのため、このプロパティは ListControl.SelectedValueChanged イベント。

ListControl.SelectedValueChanged

SelectedValueプロパティが変更されたときに発生します。

つまり、同じイベント INotifyPropertyChanged .. PropertyChanged を発生させることはありませんが、いずれにしても発生します。唯一の違いは、発火イベントです。 ComboBoxのリスト部分から新しい選択が行われるとすぐにSelectedValueChangedが起動され、ComboBoxのTextBox部分にアイテムが表示されるとSelectedItemChangedが起動されます。

要するに、両方ともComboBoxのリスト部分の何かを表します。したがって、どちらの場合もPropertyChangedイベントが発生するため、どちらのプロパティをバインドしても結果は同じです。そして、どちらもリストの要素を表しているため、おそらく同じように扱われます。

これは役立ちますか?

編集#1

ComboBoxのリスト部分がプロパティを表すと仮定すると(コントロールを記述しなかったため確認できません)、SelectedItemまたはSelectedValueのいずれかをバインドすると、内部の同じコレクションに影響しますコントロール。その後、このプロパティが変更されると、最終的に同じことが発生します。 INotifyPropertryPropertyChanged.PropertyChangedイベントは同じプロパティで発生します。

40

ComboBoxのSelectedItemプロパティは、コントロールが検証されるまで(コントロールがフォーカスを失うと発生します)変更されず、SelectedValueプロパティはユーザーが項目を選択するたびに変更されると思われます。

コントロールで発生するフォーカスイベントへの参照は次のとおりです。

http://msdn.Microsoft.com/en-us/library/system.windows.forms.control.validated.aspx

6
George Howarth

Selected.Valueを機能させるには、次のことを行う必要があります。

1. Set DisplayMember
2. Set ValueMember
3. Set DataSource (not use Items.Add, Items.AddRange, DataBinding etc.)

キーポイントはSet DataSource!です。

2
isxaker

私の経験では、これは.NETのリストコントロールの長年の「機能」です。個人的には、SelectedValueプロパティの変更時にバインドし、この「機能」を回避するために必要な追加コードを記述します(2つのプロパティを持ち、SelectedValueの1つにバインドし、そのプロパティのセットに、カスタムコードのSelectedItemから値を更新します)。

とにかく、それが= Dに役立つことを願っています

辞書にバインドしたい場合、すなわち

  <ComboBox SelectedValue="{Binding Pathology, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" 
                              ItemsSource="{x:Static RnxGlobal:CLocalizedEnums.PathologiesValues}" DisplayMemberPath="Value" SelectedValuePath="Key"
                              Margin="{StaticResource SmallMarginLeftBottom}"/>

その後、SelectedItemは動作しません。

1
Oyiwai