擁有 DataSource 是實現複雜資料繫結的第一步,但控件還需知道資料的哪些特定欄位或屬性將作為顯示與值成員。Display 成員將作為樹節點的標題,而 Value 成員可透過節點的 Value 屬性存取。這些屬性均為字串,代表欄位或屬性名稱,可輕鬆加入控件:
Private m_ValueMember As String
Private m_DisplayMember As String
Public Property ValueMember() As String
Get
Return m_ValueMember
End Get
Set(ByVal Value As String)
m_ValueMember = Value
End Set
End Property
Public Property DisplayMember() As String
Get
Return m_DisplayMember
End Get
Set(ByVal Value As String)
m_DisplayMember = Value
End Set
End Property
在此 TreeView 中,這些屬性僅代表葉節點的 Display 和 Value 成員,每個分組層級的相應資訊將在 AddGroup 方法中指定。
在前文探討的 DataSource 屬性中,建立了一個 CurrencyManager 類別的實例,並儲存在類別層級變數中。CurrencyManager 類別是實現資料繫結的關鍵,因為其屬性、方法與事件可實現以下功能:
CurrencyManager 物件允許透過 GetItemProperties 方法從資料來源的單一項目中檢索屬性或欄位值,如 DisplayMember 或 ValueMember 欄位的值。接著使用 PropertyDescriptor 物件取得特定列表項目上特定欄位或屬性的值。下列代碼片段展示這些 PropertyDescriptor 物件的建立方式,以及如何使用 GetValue 函式取得基礎資料來源中某項目的屬性值。請注意 CurrencyManager 物件的 List 屬性:透過它可存取控件繫結的 IList 實例:
Dim myNewLeafNode As TreeLeafNode
Dim currObject As Object
currObject = cm.List(currentListIndex)
If Me.DisplayMember <> "" AndAlso Me.ValueMember <> "" Then
' 新增葉節點?
Dim pdValue As System.ComponentModel.PropertyDescriptor
Dim pdDisplay As System.ComponentModel.PropertyDescriptor
pdValue = cm.GetItemProperties()(Me.ValueMember)
pdDisplay = cm.GetItemProperties()(Me.DisplayMember)
myNewLeafNode = _
New TreeLeafNode(CStr(pdDisplay.GetValue(currObject)), _
currObject, _
pdValue.GetValue(currObject), _
currentListIndex)
End If
GetValue 在回傳物件時會忽略屬性的基本資料類型,因此在使用回傳值前需進行轉換。