2010-03-02 40 views
1

鑑於此類/屬性,我如何編寫WPF數據綁定表達式以獲取myToken.DataItem("Phone")WPF:數據綁定到參數化屬性

Class Token 
    Public Property DataItem(ByVal name As String) As Object 
     Get 
      If m_DataPoints.ContainsKey(name) Then Return m_DataPoints(name) Else Return Nothing 
     End Get 
     Set(ByVal value As Object) 
      Dim oldValue = DataItem(name) 
      If Object.Equals(oldValue, value) Then Return 
      m_DataPoints(name) = value 
      OnPropertyChanged("DataPoint") 
     End Set 
    End Property 
End Class 
+0

•屬性的索引器可以在應用索引器的屬性名稱後面的方括號內指定。例如,子句Path = ShoppingCart [0]將綁定設置爲與您的屬性的內部索引處理文本字符串「0」的方式相對應的索引。多個索引器也被支持。 http://msdn.microsoft.com/en-us/library/system.windows.data.binding.path。aspx – 2010-03-02 15:44:11

回答

4

綁定的索引語法應爲你只要工作

<TextBox Text="{Binding Token[Phone]}" /> 

,或者如果您的令牌是你的DataContext只是:

<TextBox Text="{Binding [Phone]}" /> 

WPF的綁定語法沒有訪問非def的機制一個索引器。如果你不能讓你的索引器默認情況下,你必須使用轉換器:

<TextBox Text="{Binding Token,ConverterParameter=Phone,Converter={x:Static my:DataItemAccessor.Instance}}" /> 

哪裏DataItemAccessor是你寫的,它實現的IValueConverter和訪問DataItem的一個微不足道的類。

+0

「WPF的綁定語法沒有訪問非默認索引器的機制。」他們再次將VB視爲二級語言。噢,我在這個過程中還很早,我可以使用默認索引器。 – 2010-03-02 18:14:22

0

綁定不能有參數。

我建議寫一個轉換器。轉換器可以有一個參數,它可以用來訪問索引屬性。

要嘗試的另一件事是編寫一個ICustomTypeDescriptor的實現,在該實現中爲DataItem中的每個鍵返回PropertyDescriptor的子類。這個子類將使用DataItem來實現GetValue。

WPF會相信你有一個Phone屬性,並且會通過PropertyDescriptor來獲取它的值。綁定變得簡單:{綁定路徑=電話}。

0

你爲什麼不提供房產「電話」?

Default Public Property DataItem(ByVal name As String) As Object 

在這種情況下,你可以使用:作爲你的索引屬性被聲明爲默認

+0

令牌是一個通用對象,用於保存諸如CustomerKey,FirstName和LastName等基本信息。我正在尋找一個地方來推出來自查詢的附加信息,而不必創建無數的子類。 – 2010-03-02 15:40:41

+0

看到我的新命題。 – Timores 2010-03-02 15:50:45

0

也許更多的是解決辦法比的解決方案,但讓我分享我的經驗 : 在VB中我試圖定義一個索引屬性: Public Property MyIndProp(index As integer) As integer 但無法得到它以具有約束力的工作,甚至與轉換器。

(不轉換器:<控制...屬性= {結合MyIndProp [0]} />

與轉換器: <控制...屬性= {結合MyIndProp [0],轉換器= {StaticResource的MyPropIndexer},參數= 0} />)

的 '解決方案' 我發現是定義屬性作爲數組:

Public Property MyIndProp As integer() 

和不轉換器的結合的作品。 (< Control ... Property = {Binding MyIndProp [0]} />正常工作)