Следующий код работает, как Вы ожидали бы — 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
привязка).
Элемент управления 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
запускается для того же свойства.
Я подозреваю, что свойство SelectedItem ComboBox не изменяется до тех пор, пока элемент управления не будет проверен (что происходит, когда элемент управления теряет фокус), тогда как свойство SelectedValue изменяется всякий раз, когда пользователь выбирает элемент.
Вот ссылка на события фокуса, которые происходят в элементах управления:
http://msdn.microsoft.com/en-us/library/system.windows.forms.control.validated.aspx
По моему опыту, это давняя «функция» элементов управления списками в .NET. Лично я бы просто привязался к изменению свойства SelectedValue и написал любой дополнительный код, необходимый для обхода этой «функции» (например, наличие двух свойств, привязка к одному для SelectedValue, а затем, для набора этого свойства, обновление значения из SelectedItem в вашем пользовательском коде).
В любом случае, я надеюсь, что это поможет = D