鉴于此类/属性,如何编写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
答案 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;工作正常)