Подтвердить что ты не робот

ComboBox SelectedItem vs SelectedValue

Следующий код работает как ожидается youd - MyProperty в модели обновляется, когда пользователь выбирает новый элемент в раскрывающемся списке.

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

Однако, это не работает так же, и обновление модели не запускается до тех пор, пока фокус ввода не перейдет к другому элементу управления в форме:

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

Кто-нибудь знает, почему? Я даже не знаю, с чего начать расследование. Указатели в правильном направлении для начала расследования или прямого объяснения будут одинаково оценены.

Кроме того: в моих целях я оказался привязан к SelectedItem и SelectedValue. Таким образом, я получаю мгновенные обновления моделей на основе изменений пользовательского интерфейса (через привязку SelectedValue) и обновлений пользовательского интерфейса на основе изменения программной модели (через привязку SelectedItem).

4b9b3361

Ответ 1

Элемент ComboBox наследует от ListControl.

Свойство SelectedItem является правильным элементом элемента управления ComboBox. Событие, которое запускается при изменении, ComboBox.SelectionChangeCommitted

ComboBox.SelectionChangeCommitted

Происходит, когда выбранный элемент изменен, и это изменение отображается в ComboBox.

Свойство SelectedValue наследуется от элемента управления ListControl. Таким образом, это свойство будет запускать событие ListControl.SelectedValueChanged.

ListControl.SelectedValueChanged

Возникает при изменении свойства SelectedValue.

Тем не менее, они не будут запускать INotifyPropertyChanged. PropertyChanged то же самое, но они все равно будут. Единственное различие заключается в событии увольнения. SelectedValueChanged запускается, как только будет сделан новый выбор из части списка ComboBox, и SelectedItemChanged запускается, когда элемент отображается в части TextBox ComboBox.

Короче говоря, они оба представляют что-то в части списка ComboBox. Таким образом, при связывании любого свойства результат будет таким же, поскольку событие PropertyChanged запускается в любом случае. И поскольку оба они представляют собой элемент из списка, они, вероятно, рассматриваются одинаково.

Помогает ли это?

РЕДАКТИРОВАТЬ № 1

Предполагая, что часть списка ComboBox представляет свойство (поскольку я не могу подтвердить, так как я не написал элемент управления), привязка любого из SelectedItem или SelectedValue влияет на одну и ту же коллекцию внутри элемента управления. Затем, когда это свойство изменяется, это происходит в конце. Событие INotifyPropertryPropertyChanged.PropertyChanged запускается с тем же свойством.

Ответ 2

Я подозреваю, что свойство SelectedItem ComboBox не изменяется до тех пор, пока элемент управления не будет проверен (что происходит, когда элемент управления теряет фокус), тогда как свойство SelectedValue изменяется всякий раз, когда пользователь выбирает элемент.

Вот ссылка на события фокуса, которые происходят на элементах управления:

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

Ответ 3

Это давняя "функция" элементов управления списками в .NET в моем опыте. Лично я просто привязывался бы к изменению свойства SelectedValue и записывал бы любой дополнительный код, необходимый для обхода этой "функции" (например, наличия двух свойств, привязанных к одному для SelectedValue, а затем, по набору этого свойства, обновляя значение из SelectedItem в вашем пользовательском коде).

В любом случае, я надеюсь, что help = D

Ответ 4

ЕСЛИ вы хотите, чтобы Selected.Value работал необходимо выполнить следующие

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

Ключевым моментом является Set DataSource!

Ответ 5

Если мы хотим привязать к словарю, то есть

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

то SelectedItem не будет работать whilist SelectedValue будет