Да, мне нужно использовать XPath
, но это еще не все.
Мои ошибки были:
Вы не можете использовать DataSet
напрямую, но нужно обернуть его в XmlDataDocument
Также моя проблема связана с пространствами имен. Чтобы подавить их, вы должны установить DataSet.Namespace = String.Empty
до создания XmlDataDocument
.
Если вы хотите использовать пространства имен, вам нужно создать XmlNamespaceMappingCollection
в XAML, как это
<UserControl.Resources>
<XmlNamespaceMappingCollection x:Key="namespace">
<XmlNamespaceMapping Prefix="ds" Uri="http://tempuri.org/DataSet.xsd" />
</XmlNamespaceMappingCollection>
</UserControl.Resources>
Для ссылки на пространство имен в XPath. Простое добавление его как xmlns не сработает (в отличие от того, что я ожидал).
Тогда ссылка на определенную строку работала так:
<Label Content="{Binding XPath='//TableName[4]'}" />
Если вы используете пространства имен, вам нужно сослаться на XmlNamespaceManager
<Label Content="{Binding XPath='//ds:TableName[4]'}" Binding.XmlNamespaceManager="{StaticResource namespace}" />
Теперь, когда этот очень простой XPath работает, добавление ограничения приведет к полной загрузке ЦП, и моя программа не будет продолжаться:
<Label Content="{Binding XPath='//TableName[Process = 4]'}" />
or
<Label Content="{Binding XPath='//ds:TableName[ds:Process = 4]'}" Binding.XmlNamespaceManager="{StaticResource namespace}" />
EDIT
Похоже, что привязка должна быть в режиме OneTime
. Просто изменив его на
<Label Content="{Binding Mode=OneTime, XPath='//TableName[Process = 4]'}" />
заставил это работать. Я также использую ContentTemplate
и в шаблоне привязка может быть TwoWay
, но там XPath примитивен (например, ./Prozess
), может быть, поэтому.