Примечание. Вы также можете использовать более сложные пути, состоящие из нескольких частей, например, если свойство интерфейса находится внутри пути:
<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. Глупая ошибка копирования / вставки, которую я продолжаю делать.
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}"/>