2010-05-21 7 views
40

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

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

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

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

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

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

ответ

36

В 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 запускается в любом случае. И поскольку оба они представляют собой элемент из списка, они, вероятно, рассматриваются одинаково.

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

EDIT # 1

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

2

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

Во всяком случае, я надеюсь, что помогает = D

+1

я в конечном итоге создание двух привязок - один к SelectedValue и один в SelectedItem и Ждут» t нужен какой-либо пользовательский код, кроме этого. :) –

+0

@ Anna Рад слышать, что у вас это работает :) –

5

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

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

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

+0

Лучший ответ, чем мой. Также важно указать, что вы не сможете использовать SelectedItem при привязке к SelectedValue, потому что он еще не будет обновлен. Если я правильно помню, вам нужно использовать извлечение из коллекции Items элемента управления List SelectedIndex. –

1

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

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

Ключевой момент устанавливается DataSource!

0

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

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

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