C # (Winforms) привязка данных с использованием Listbox.SelectedValue в качестве источника данных (master-detail) - PullRequest
0 голосов
/ 31 января 2012

У меня есть список, связанный с List<object> в качестве источника данных. То, что я хочу сделать, это использовать свойство SelectedValue списка (т.е. объект, соответствующий текущему выбору) в качестве источника данных для некоторых текстовых полей, которые будут отображать определенные значения объекта для редактирования. Я пробовал

TextBox.DataBindings.Add(new Binding("Text", ListBox, "SelectedValue.name"));    

и

TextBox.DataBindings.Add(new Binding("Text", ListBox.SelectedValue, "name"));

но поскольку в ListBox ничего не выбрано (поскольку форма еще не показана), я получаю исключение по поводу "Значение не может быть пустым".

Теперь я знаю, что могу (пере) привязать к ListBox.SelectedValue в обработчике SelectionChangeCommitted моей формы (то есть после того, как выбор был сделан), но если мне нужно сделать это, я мог бы просто установить значение TextBox напрямую (по общему признанию, я мог бы просто сделать это, чтобы решить проблему, но я хотел бы узнать больше о привязке данных).

Итак, мой вопрос, вкратце: возможно ли привязать ListBox.SelectedValue один раз (изначально, до того, как ListBox имеет выбор) и избежать исключения нулевого значения, и если да, то как?

Ответы [ 2 ]

1 голос
/ 31 января 2012

Я не уверен, какой контроль над вашим projectNameCtrl, но вы захотите связать свой TextBox. Как то так:

textBox1.DataBindings.Add(new Binding("Text", listBox1, "selectedvalue"));

Где:
textBox1 это ваш TextBox
listBox1 это ваш ListView

EDIT
Вы должны иметь возможность привязывать данные к ListBox, даже если этот ListBox не имеет выбранных элементов, поэтому ваше «значение не может быть нулевым» должно быть по другой причине. Я предлагаю использовать отладчик, чтобы определить, какой именно объект является нулевым.

Вы можете убедиться, что данные не связывают элемент управления более одного раза, предварительно проверив свойство DataBindings.Count элемента управления; если он равен нулю, вы еще не привязали данные к этому элементу управления:

if (textBox1.DataBindings.Count == 0) {
    // OK to data bind textBox1.
}
0 голосов
/ 31 января 2012

Мне кажется, что вам нужно что-то делать с каждым событием selectedItemChanged ...

Я знаю, что это не отвечает на ваш вопрос, но я бы вместо этого посмотрел на использование WPF, поскольку это гораздо более элегантно сделать в WPF, и давайте посмотрим правде в глаза, не создавая GUI в коде (вместо этого используйте XAML ) ваше здравомыслие будет гораздо более целым, когда вы закончите свой проект. Я не помню достаточного количества оконных форм, но в WPF вы просто реализуете INotifyPropertyChanged на своем внутреннем объекте, к которому привязываетесь, а затем, когда вы привязываетесь к свойству SelectedItem этого ListBox, вы автоматически получаете обновления, так как SelectedItem свойство является DependencyProperty.

...