WPF:数据绑定到参数化属性

时间:2010-03-02 15:08:16

标签: wpf vb.net binding

鉴于此类/属性,如何编写WPF数据绑定表达式以获取myToken.DataItem("Phone")

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

4 个答案:

答案 0 :(得分:4)

只要索引属性声明为默认值,

绑定的索引器语法应该适用于您:

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

在这种情况下,您可以使用:

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

或者您的令牌只是您的DataContext:

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

WPF的Binding语法没有访问非默认索引器的机制。如果您无法使索引器成为默认值,则必须使用转换器:

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

其中DataItemAccessor是一个简单的类,你编写实现IValueConverter并访问DataItem。

答案 1 :(得分:0)

绑定不能有参数。

我建议写一个转换器。转换器可以有一个参数,可用于访问索引属性。

尝试的另一件事是编写ICustomTypeDescriptor的实现,在其中为DataItem中的每个键返回PropertyDescriptor的子类。该子类将使用DataItem实现GetValue。

WPF将相信您拥有Phone属性,并将通过PropertyDescriptor获取其值。绑定变得简单:{Binding Path = Phone}。

答案 2 :(得分:0)

为什么不提供“电话”属性?

答案 3 :(得分:0)

也许更多的解决方法而不是解决方案,但让我分享一下 经验: 在vb中,我试图定义一个索引属性: Public Property MyIndProp(index As integer) As integer 但即使使用转换器也无法使其在绑定中工作。

(没有转换器:&lt; Control ... Property = {Binding MyIndProp [0]} /&gt;

带转换器:    &LT; Control ... Property = {Binding MyIndProp [0],Converter = {StaticResource MyPropIndexer},Parameter = 0} /&gt; )

我找到的'解决方案'是将属性定义为数组:

Public Property MyIndProp As integer()

并且绑定无需转换器。 (&lt; Control ... Property = {Binding MyIndProp [0]} /&gt;工作正常)