ComboBox SelectedItem против SelectedValue - PullRequest
47 голосов
/ 21 мая 2010

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

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

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

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

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

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

Ответы [ 5 ]

39 голосов
/ 21 мая 2010

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

5 голосов
/ 21 мая 2010

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

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

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

2 голосов
/ 12 августа 2013

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

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

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

2 голосов
/ 21 мая 2010

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

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

1 голос
/ 26 февраля 2017

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

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

тогда SelectedItem не будет работать, в то время как SelectedValue будет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...