Привязка ComboBox к IList и использование SelectedValue
-
05-07-2019 - |
Вопрос
у меня есть ComboBox
настроить следующим образом, где KVPList
является IList
(из KeyValuePair
если это имеет значение):
comboBox.DisplayMember = "Value";
comboBox.ValueMember = "Key";
comboBox.DataSource = KVPList;
Затем я установил привязку с SelectedValue
, привязка к BindingSource
(к DataSet
).По какой-то причине поле со списком всегда оказывается пустым при отображении формы.Однако он правильно заполнен (значения IList
отображаются нормально и могут быть выбраны).
Теперь я изо всех сил старался отследить, и, похоже, сначала при привязке SelectedValue правильно устанавливается, но затем где-то по пути оно сбрасывается на null
.Я тоже играл с порядком вызова, но безрезультатно.
Может ли кто-нибудь пролить свет на этот вопрос или предложить обходной путь?
Для справки: в том же бланке у меня есть еще один ComboBox
в той же форме, со своим SelectedValue
привязан к тому же BindingSource
.А DataSource
это DataSet
, а не IList
и это работает как шарм.Возможно, это вариант сделать DataTable
из IList
, но кажется, что это лишние накладные расходы;Я генерирую IList
из перечисления.
Решение
Ой.Потратив на это полдня, я понял это.Это была полностью ошибка с моей стороны.
А KVPList
был установлен на IList
из KeyValuePair<
short
,string>
, но поле данных имеет тип int
.По сути, привязка данных сработает и установит SelectedValue
свойство.Тогда DisplayMember
и ValueMember
привязки сработают, проверяя SelectedValue
снова.Поскольку ValueMember
имеет тип short
, нет int
, он не найдет совпадение и поэтому установит для него значение null.
Должно быть, что-то забавное происходит с упаковкой и распаковкой, но я слишком устал, чтобы понять, почему прямо сейчас.
Я оставлю этот вопрос на случай, если кто-то еще столкнется с той же проблемой.Это трудно отследить, потому что я ожидаю, что он либо попытается создать исключение, либо выдаст исключение, а не молча обнулится.После всего, short
и int
оба типа значений и последнее, что я проверял (int)10 == (short)10
Справедливо.