«Необходим диспетчер пространства имен или XsltContext», когда {Binding XPath = ns: Foo} - PullRequest
1 голос
/ 10 марта 2010

Я привязываю DataTemplates к XmlDataProvider. Поскольку рассматриваемые данные XML используют пространства имен, я также прикрепил XmlNamespaceManager к XmlDataProvider и сопоставил префикс с ним.

Когда привязка к XPath только начинается с корня XmlDataProvider, префикс пространства имен понимается очень хорошо, и я получаю результаты. Однако, если из DataTemplate я пытаюсь выполнить другую привязку на основе XPath, в окне «Вывод» отображается эта ошибка во время выполнения:

Не удалось получить коллекцию узлов результатов из-за неверного исходного узла или неверного пути .; SourceNode = 'IntegrationProfile'; Path = 'i: Role' BindingExpression: Path =; DataItem = 'XmlElement' (HashCode = 19883454); целевой элемент - TabControl (Name = '); Свойство target - «ItemsSource» (тип «IEnumerable»). XPathException: «System.Xml.XPath.XPathException: необходим менеджер пространства имен или XsltContext. Этот запрос имеет префикс, переменную или пользовательскую функцию.

Эта ошибка была вызвана этой строкой XAML:

<TabControl ItemsSource="{Binding XPath=i:Role}"/>

, который находится в шаблоне данных. NamespaceManager был прикреплен в коде, например так:

_profile = new XmlDataProvider();
_profile.Document = new XmlDocument();
_profile.Document.Load(ProfilePath);
_profile.XmlNamespaceManager = NamespaceManager;

WPF забывает, что к нему прикреплен NamespaceManager?

1 Ответ

0 голосов
/ 11 марта 2010

Сам нашел причину и решение.

Причина: DataContext объекта DataTemplate привязан к дочернему элементу, выбранному в первом запросе, и область действия не «достигает» места, к которому присоединен NamespaceManager.

Решение. Создайте коллекцию XmlNamespaceMappingCollection в блоке ресурсов:

<Window.Resources>
    <XmlNamespaceMappingCollection x:Key="MyNamespaces">
        <XmlNamespaceMapping Uri="http://foo.com/MyNamespace" Prefix="i"/>
    </XmlNamespaceMappingCollection>
    ...
</Window.Resources>

Затем поместите следующий атрибут в родительский элемент любого элемента управления, который делает запросы XPath в своих привязках:

Binding.XmlNamespaceManager="{StaticResource MyNamespaces}"

Поместить его в тот же элемент рядом с ItemSource = "..." не сработало, но сделать его атрибутом родительского элемента сработало.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...