Привязка данных списка пользовательских объектов к коллекции ComboBox - PullRequest
2 голосов
/ 26 июля 2010

Я работаю над проектом, который управляет несколькими устройствами через USB и перехватывает события WM_DEVICECHANGE из Windows для управления подключенными в данный момент устройствами и подключаемыми модулями с использованием этих устройств. В главной форме существует поле со списком, который (должен) отображать все доступные устройства (пользовательский объект) и динамически обновляться в случае прибытия или удаления устройства.

Теперь, каждый учебник, который я прочитал, включая некоторые из них, велел мне установить для свойства DataSource комбинированного списка значение «Список объектов», который у меня есть, и оставить свойство DisplayMember / ValueMember пустым для отображения ToString () и вернуть объект в качестве значения.

В некоторых случаях, которые я пробовал (например, после создания экземпляра Списка и заполнения его образцами / реальными объектами), поле со списком заполняется, однако при удалении или поступлении коллекция в списке не обновляется даже при переназначении Списка для объекта. свойство DataSource combobox после каждого метода прибытия / удаления устройства.

РЕДАКТИРОВАТЬ: Ах да ... вопрос ...

Как динамически привязать коллекцию (пользовательских объектов, возвращаемых в качестве значений), чтобы она могла обрабатывать внезапные изменения (добавления / удаления) содержимого списка?

РЕДАКТИРОВАТЬ 2: Извините, я не прояснил это, не знал о том, как получил широкое распространение WPF, но это проект WinForms .

Заранее благодарим за любую помощь, которую вы можете оказать. :)

Ответы [ 3 ]

1 голос
/ 26 июля 2010

даже при переназначении List в свойство DataSource комбобокса после каждого метода прибытия / удаления устройства.

После переназначения вам нужно снова вызвать .DataBind().

Если вы используете .net 3.5 или выше, вы можете использовать ObservableCollection для автоматического обновления списка.

0 голосов
/ 26 июля 2010

Я не знаю насчет этого бита ToString ().Я всегда устанавливаю DisplayMember на свойство, которое я хочу отобразить.Меня не волнует ValueMember, потому что SelectedItem - это мой Object.

DataBind не применяется, если это проект WinForms, на что это похоже.(USB и прочее)

Я не делаю ничего прикольного в своем проекте, когда обновляю данные в ComboBox, я просто снова устанавливаю источник данных.

РЕДАКТИРОВАТЬ: Вы также можете попробовать использовать BindingList вместо List.http://msdn.microsoft.com/en-us/library/ms132679.aspx

0 голосов
/ 26 июля 2010

Я не уверен, используете ли вы WinForms или WPF. Я предполагаю, что WPF никто не должен начинать с WinForms в наше время ...


Вам необходимо изменить свой список на ObservableCollection .

Модель привязки WPF в значительной степени опирается на магическую подсистему фей и чернокнижников (не насмехаясь над вами, я на самом деле серьезно). У них есть свой собственный язык для информирования друг друга о том, что что-то изменилось между DataContext и UI. В первую очередь это свойства DependencyObject / Dependency, INotifyPropertyChanged и INotifyCollectionChanged, а также ObservableCollection .

При правильном использовании этих тотемов изменения в ваших ViewModels / Models (материал, который вы вставляете в DataContext и / или привязываете к DataSource), будут отражены в интерфейсе пользователя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...