次のコードは期待どおりに機能します。モデルのMyProperty
は、ユーザーがドロップダウンで新しいアイテムを選択すると更新されます。
comboBox1.DataBindings.Add("SelectedValue", myModel, "MyProperty", true,
DataSourceUpdateMode.OnPropertyChanged);
ただし、次は同じ方法では機能せず、入力フォーカスがフォーム上の別のコントロールに移動するまでモデルの更新はトリガーされません。
comboBox1.DataBindings.Add("SelectedItem", myModel, "MyProperty", true,
DataSourceUpdateMode.OnPropertyChanged);
誰かが理由を知っていますか?原因の調査をどこから開始すればよいかさえわかりません。調査を開始するための正しい方向へのポインタまたは明確な説明も同様に歓迎されます。
脇:私の目的のために、SelectedItem
とSelectedValue
の両方にバインドすることになりました。この方法で、UIの変更に基づいて(SelectedValue
バインディングを介して)モデルの更新を即座に取得し、プログラムによるモデルの変更に基づいて(SelectedItem
バインディングを介して)UIの更新を取得します。
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
イベントは同じプロパティで発生します。
ComboBoxのSelectedItemプロパティは、コントロールが検証されるまで(コントロールがフォーカスを失うと発生します)変更されず、SelectedValueプロパティはユーザーが項目を選択するたびに変更されると思われます。
コントロールで発生するフォーカスイベントへの参照は次のとおりです。
http://msdn.Microsoft.com/en-us/library/system.windows.forms.control.validated.aspx
Selected.Valueを機能させるには、次のことを行う必要があります。
1. Set DisplayMember
2. Set ValueMember
3. Set DataSource (not use Items.Add, Items.AddRange, DataBinding etc.)
キーポイントはSet DataSource!です。
私の経験では、これは.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は動作しません。