注意:如果接口属性位于路径内,您也可以使用更复杂的多部分路径,例如:
<TextBlock>
<TextBlock.Text>
<Binding Path="Packages[0].(myNamespace:IShippingPackage.ShippingMethod).CarrierServiceCode"/>
</TextBlock.Text>
</TextBlock>
或者直接使用Binding
指令。
<TextBlock Text="{Binding Path=Packages[0].(myNamespace:IShippingPackage.ShippingMethod).CarrierServiceCode}"/>
或者当使用接口的多个属性时,您可以在本地重新定义DataContext以使代码更易读。
<StackPanel DataContext={Binding Path=Packages[0].(myNamespace:IShippingPackage.ShippingMethod)}">
<TextBlock Text="{Binding CarrierName}"/>
<TextBlock Text="{Binding CarrierServiceCode}"/>
</StackPanel>
提示:注意不要在路径表达式的末尾意外地以
)}
结尾。这是我经常犯的一个愚蠢的复制/粘贴错误。
Path="(myNameSpace:IShippingPackage.ShippingMethod)}"
确保使用Path=
发现如果我没有明确使用
Path=
,则可能无法解析绑定。通常我会写出类似这样的内容:
Text="{Binding FirstName}"
替代
Text="{Binding Path=FirstName}"
但是在更复杂的界面绑定中,我发现需要使用 Path=
来避免这个异常:
System.ArgumentNullException: Key cannot be null.
Parameter name: key
at System.Collections.Specialized.ListDictionary.get_Item(Object key)
at System.Collections.Specialized.HybridDictionary.get_Item(Object key)
at System.ComponentModel.PropertyChangedEventManager.RemoveListener(INotifyPropertyChanged source, String propertyName, IWeakEventListener listener, EventHandler`1 handler)
at System.ComponentModel.PropertyChangedEventManager.RemoveHandler(INotifyPropertyChanged source, EventHandler`1 handler, String propertyName)
at MS.Internal.Data.PropertyPathWorker.ReplaceItem(Int32 k, Object newO, Object parent)
at MS.Internal.Data.PropertyPathWorker.UpdateSourceValueState(Int32 k, ICollectionView collectionView, Object newValue, Boolean isASubPropertyChange)
即不要这样做:
<TextBlock Text="{Binding Packages[0].(myNamespace:IShippingPackage.ShippingMethod).CarrierServiceCode}"/>