Связывание свойств вложенных объектов UltraWinGrid с BindingSource

Я работаю над приложением winforms, где я обрабатываю данные домена/объекта через ultrawingrid. Я использую источник привязки для привязки объекта к сетке. Для простых объектов это работает достаточно хорошо.

То, что я пытаюсь понять, - это рендеринг объекта с вложенными объектами, например, класс Person будет иметь свойство класса Address. Я хотел бы отображать свойства адреса (улица, город, страна) в виде столбцов в сетке вместе со свойствами класса Person.

Сетка должна быть редактируемой, и любые пользовательские изменения должны отражаться на объекте домена (что я делаю через источник привязки).

Как лучше всего это сделать?


person vsfm    schedule 12.01.2012    source источник


Ответы (1)


Привязка

Обычно я использую такой код:

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

Сведение иерархий объектов

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

  1. Несвязанные столбцы в пользовательском интерфейсе, которые вы заполняете во время события InitializeRow.
  2. Измените свой класс Person, чтобы предоставить свойства Address с некоторым сквозным кодом для обработки настройки свойств.

(при необходимости могу предоставить образцы кода)

Вложенные объекты "один ко многим"

Если у вас, например, было несколько адресов на человека, вы могли бы показать их вложенными в расширяемый раздел под каждой строкой Person. Для этого внутри вашего Person у вас будет BindingList(Of Address), который также реализует INotifyPropertyChanged. Не совсем то, что вы хотите, но вариант :)

Слова предостережения

Несколько замечаний, если вы делаете MVP. Очевидно, вам понадобится одна и та же ссылка на BindingList в представлении и в презентаторе. Кроме того, если вам нужно сбросить содержимое, я бы рекомендовал позвонить list.Clear() вместо создания нового. Если вы создадите новый в своем презентере, вы разорвете соединение с UltraGrid, и вам придется заново установить свойство DataSource в представлении.

person Jeff B    schedule 14.06.2012