Привязка WinForms ListBox к свойствам объекта - PullRequest
2 голосов
/ 29 ноября 2009

Я впервые делаю кодирование WinForms и пытаюсь использовать привязки данных.

У меня есть список, который я привязываю к массиву строк из моего объекта контроллера, и я также хочу привязать SelectedItem из списка к другому свойству строки в контроллере, чтобы я мог отслеживать его.

listBox.DataSource = controller.ItemNames;
listBox.DataBindings.Add(new Binding("SelectedItem", controller, "CurrentItem"));

Я хочу, чтобы свойство CurrentItem на контроллере обновлялось, как только пользователь выбирает другие элементы в списке, но, похоже, оно будет обновляться только при перемещении фокуса на другой элемент в форме.

Это ожидаемое поведение? Есть ли способ немедленно обновить привязку SelectedItem?

Ответы [ 3 ]

9 голосов
/ 15 апреля 2010

В общем, если вам нужно, чтобы ваша модель была обновлена ​​немедленно, вы должны использовать Use DataSourceUpdateMode.OnPropertyChanged, как предложено в другом посте.

Но это не работает для ListBox.SelectedItem. Причина в том, что ListBox не предоставляет событие SelectedItemChanged (но предоставляет SelectedValueChanged и SelectedIndexChanged), поэтому DataBinding не имеет представления о том, что что-то изменилось в элементе управления.

В качестве обходного пути вы можете поместить следующие строки в код настройки для вашего элемента управления:

listBox.SelectedIndexChanged +=
  (s, args) => listBox.DataBindings["SelectedItem"].WriteValue();
5 голосов
/ 02 декабря 2009

Использовать DataSourceUpdateMode.OnPropertyChanged

listBox.DataBindings.Add(new Binding("SelectedItem", controller, "CurrentItem", 
                                true, DataSourceUpdateMode.OnPropertyChanged));
0 голосов
/ 20 февраля 2015

В общем случае (ValueMember не указано), если вы привязываетесь к составному объекту, вы можете использовать SelectedValue, что должно равняться SelectedItem.

Как упомянуто Андрей ListBox обеспечивает уведомление в режиме реального времени для SelectedValue изменения значения.

Так что этого кода должно быть достаточно:

listBox.DataBindings.Add("SelectedValue", controller, "CurrentItem", true, DataSourceUpdateMode.OnPropertyChanged);

Есть один побочный эффект: установка CurrentItem не будет обновлять ListBox.

В видах основных деталей все должно быть в порядке: вначале вы просто должны убедиться, что SelectedItem (первый по умолчанию) соответствует CurrentItem, затем рабочий процесс ведомый мастером, ListBox.

Если это проблема, воспользуйтесь решением Andrey .

...