2

我正在开发一个 winforms 应用程序,在该应用程序中我通过 ultrawingrid 呈现域/对象数据。我正在使用绑定源将对象绑定到网格。对于简单的对象,这非常有效。

我想要解决的问题是渲染一个带有嵌套对象的对象,例如 Person 类将具有 Address 类的属性。我想将 Address (Street, City, Country) 的属性显示为网格上的列以及 Person 类的属性。

网格必须是可编辑的,并且任何用户更改都需要反映在域对象上(我正在通过绑定源执行此操作)。

解决这个问题的最佳方法是什么?

4

1 回答 1

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 事件期间填写的 UI 中的未绑定列
  2. 修改您的Person类以Address使用一些传递代码来公开属性以处理属性的设置。

(如果需要,我可以提供代码示例)

一对多嵌套对象

例如,如果您每个人有多个地址,则可以将它们嵌套在每Person行下方的可展开部分中。为此,在您的内部您Person将拥有一个BindingList(Of Address)which 也实现了INotifyPropertyChanged. 不完全是您想要的,而是一个选项:)

小心的话

如果您正在做MVP ,请注意一些事项。BindingList显然,您需要在您的视图和演示者中具有相同的引用。此外,如果您需要重置内容,我建议您致电list.Clear()而不是创建新内容。如果您在演示者中创建一个新的,您将断开与 的连接,UltraGrid您将不得不在视图中重新设置该DataSource属性。

于 2012-06-14T21:56:25.307 回答