Сбой привязки объекта к Winforms ComboBox, когда SelectedItem имеет значение null

Я нашел много сообщений, которые уклоняются от этой темы, но ни один из них не касается этого случая.

У меня есть ComboBox, привязанный к List<State>, где State — это бизнес-объект со свойствами Abbreviation и Name:

this._stateComboBox.DataSource = ((Address)this._addressBindingSource.DataSource).States;
this._stateComboBox.DisplayMember = "Abbreviation";
this._stateComboBox.DataBindings.Add(new System.Windows.Forms.Binding("SelectedItem", this._addressBindingSource, "State"));

Первоначально поле со списком отображается пустым, поскольку состояние не выбрано. Если я перехожу к ComboBox и пытаюсь выйти, SelectedItem имеет значение null, но я получаю исключение:

Object of type 'System.DBNull' cannot be converted to type 'State'.

Любая идея, почему BindingSource, кажется, берет null SelectedItem и делает его System.DBNull, прежде чем пытаться присвоить его свойству Address.State? Это исключение возникает в OnValidating перед вызовом моего установщика состояния. Без отладчика похоже, что фокус застревает на ComboBox.

Я не хочу добавлять пустой объект State в свой источник данных с пустыми аббревиатурой и именем. Как я могу обойти эту проблему?


person Hadster    schedule 14.07.2010    source источник


Ответы (1)


Это связано с тем, что проверка управления является значением по умолчанию для класса Binding. Возможно, вы захотите изменить свойство Binding.DataSourceUpdateMode на DataSourceUpdateMode.OnPropertyChanged, чтобы значение присваивалось только тогда, когда пользователь изменяет выбор поля со списком.

person Hans Passant    schedule 14.07.2010
comment
Это не очень хорошо для меня работало; однако это дало мне подсказку, которая привела меня к обходному пути: теперь я устанавливаю DataSourceNullValue = null при создании объекта Binding. Хотя это позволяет мне обойти исключение, к сожалению, это не позволяет мне зафиксировать значение null. Другими словами, если я стираю отображаемое значение моего элемента управления, ненулевое значение свойства извлекается из связанного объекта во время проверки, а не устанавливается для свойства связанного объекта значение null. - person Hadster; 23.08.2010
comment
Я боролся с этим в течение нескольких часов, пока не нашел этот пост. Спасибо! - person Jason Turan; 28.12.2012
comment
Это может быть обходной путь, но мне интересно ответить на фактический вопрос. Почему это происходит, где null превращается в DBNull и, что более важно, как этого не допустить? - person lc.; 18.01.2017