Привязка ComboBox к IList и использование SelectedValue - PullRequest
5 голосов
/ 07 января 2009

У меня ComboBox настроен следующим образом, где KVPList - это IList (из KeyValuePair, если это важно):

comboBox.DisplayMember = "Value";
comboBox.ValueMember = "Key";
comboBox.DataSource = KVPList;

Затем я установил привязку с SelectedValue, привязкой к BindingSourceDataSet). По какой-либо причине поле со списком всегда становится пустым, когда отображается форма. Однако он заполнен правильно (значения IList отображаются нормально и могут быть выбраны).

Теперь, я старался изо всех сил проследить, и кажется, что он изначально правильно установил SelectedValue при привязке, но затем где-то по пути он сбрасывается до null. Я играл с порядком вещей, которые также называются, но безрезультатно.

Может кто-нибудь пролить свет на это или предложить обходной путь?

Для записи, в той же форме, у меня есть другой ComboBox в той же форме, с SelectedValue, привязанным к тому же BindingSource. DataSource - это DataSet, а не IList, и он работает как шарм. Это может быть вариант сделать DataTable из IList, но это похоже на большие дополнительные затраты; Я генерирую IList из перечисления.

1 Ответ

7 голосов
/ 07 января 2009

Уч. После того, как я потратил на это почти полдня, я понял это. Это была полностью ошибка с моей стороны.

KVPList было установлено на IList из KeyValuePair<short,string>, но поле данных имеет тип int. По сути, привязка данных сработает и установит свойство SelectedValue. Затем сработают привязки DisplayMember и ValueMember, снова проверяя SelectedValue. Так как ValueMember имеет тип short, а не int, он не найдет совпадение и, таким образом, установит его в null.

Что-то смешное должно происходить с боксом и распаковкой, но я слишком устал, чтобы понять почему прямо сейчас.

Я оставлю этот вопрос на тот случай, если кто-то еще столкнется с той же проблемой. Трудно отследить, потому что я ожидаю, что он либо попытается разыграть, либо сгенерировать исключение, а не молча обнуляться. В конце концов, short и int оба являются типами значений, и в последний раз я проверял (int)10 == (short)10 верно.

...