Привязка
Обычно я использую такой код:
Dim persons = new BindingList(Of Person)
UltraGrid1.DataSource = persons
Список привязки будет обрабатывать добавление/удаление строк для вас, но он не знает о свойствах внутри Person
. Чтобы эта часть привязки работала, вам потребуется Person
реализовать INotifyPropertyChanged. Это уведомит ультрагрид об изменении свойств. Код будет выглядеть примерно так (да, к сожалению, это делает так, что вы не можете использовать автоматически реализуемые свойства):
Private _phoneNumber As String
Public Property PhoneNumber As String
Get
Return Me._phoneNumber
End Get
Set(ByVal value As String)
If value <> _phoneNumber Then
Me._phoneNumber = value
NotifyPropertyChanged("PhoneNumber")
End If
End Set
End Property
Сведение иерархий объектов
Похоже, то, о чем вы просите, невозможно напрямую. Есть несколько вариантов:
- Несвязанные столбцы в пользовательском интерфейсе, которые вы заполняете во время события InitializeRow.
- Измените свой класс
Person
, чтобы предоставить свойства Address
с некоторым сквозным кодом для обработки настройки свойств.
(при необходимости могу предоставить образцы кода)
Вложенные объекты "один ко многим"
Если у вас, например, было несколько адресов на человека, вы могли бы показать их вложенными в расширяемый раздел под каждой строкой Person
. Для этого внутри вашего Person
у вас будет BindingList(Of Address)
, который также реализует INotifyPropertyChanged
. Не совсем то, что вы хотите, но вариант :)
Слова предостережения
Несколько замечаний, если вы делаете MVP. Очевидно, вам понадобится одна и та же ссылка на BindingList
в представлении и в презентаторе. Кроме того, если вам нужно сбросить содержимое, я бы рекомендовал позвонить list.Clear()
вместо создания нового. Если вы создадите новый в своем презентере, вы разорвете соединение с UltraGrid
, и вам придется заново установить свойство DataSource
в представлении.
person
Jeff B
schedule
14.06.2012