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
).
Ответы
Ответ 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 будет