Связывание свойств вложенных объектов UltraWinGrid с помощью BindingSource - PullRequest
2 голосов
/ 12 января 2012

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

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

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

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

1 Ответ

1 голос
/ 15 июня 2012

Binding

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

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 в представлении.

...