ComboBox SelectedItem по сравнению с SelectedValue

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

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

Следующее, однако, не работает, тот же путь и образцовое обновление не инициированы, пока фокус ввода не перемещается в другое управление на форме:

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

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

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

49
задан Adam Lear 25 June 2012 в 18:20
поделиться

3 ответа

Элемент управления 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 запускается для того же свойства.

41
ответ дан 7 November 2019 в 11:54
поделиться

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

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

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

6
ответ дан 7 November 2019 в 11:54
поделиться

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

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

2
ответ дан 7 November 2019 в 11:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: