Как связать XmlDataProvider.Source со свойством MVVM

У меня есть дерево, привязанное к XmlDataProvider следуя этому примеру. Приложение, над которым я работаю, следует шаблону MVVM, а Xml - из файла, который откроет пользователь.

Когда я пытаюсь связать свойство Source XmlDataProvider вот так

<XmlDataProvider Source="{Binding Path=XmlFilePath}"/>

Я получаю "Привязка может быть применена только к DependencyProperty объекта Dependency". или что-то подобное.

Таким образом, если не связать воедино связывание процедурно, то есть способ декларативно связать XmlDataProviderSource? Если я попытаюсь отказаться от поставщика данных и связать дерево непосредственно с XmlNode свойство Я получаю ошибку об использовании привязки XPath только с объектами Xml; это абсолютно бессмысленно для меня, но я уверен, что оно пытается сказать мне что-то важное.

3 ответа

Решение

Похоже, ответ: вы не можете.

Я смог решить основную проблему (привязку дерева к документу XML), удалив XmlDataProvider из уравнения и привязки TreeView напрямую к свойству ViewModel, которое возвращает XmlNode.

Меня сбило с толку то, что я взял обязательный код, который указывал на XmlDataProvider и указал на мою собственность, оставив аргумент XPath на месте.

<TreeView ItemsSource="{Binding Path=ProjectDocument XPath=.}">

Это приведет к ошибке во время выполнения: System.Windows.Data Error: 44 : BindingExpression with XPath cannot bind to non-XML object.; XPath='.'

Что было не самым полезным. Что он действительно хотел сказать, так это то, что вы не можете связать XmlNode собственность И предоставить XPath аргумент в привязке (потому что это XmlDataProvider, который знает, что с этим делать??).

<TreeView ItemsSource="{Binding Path=ProjectDocument}">

На самом деле это была довольно сложная проблема для меня, потому что мне нужно, чтобы приложение загружало древовидное представление из временного файла, и, предполагая, что приложение может иметь разные местоположения, я не могу установить строгую ссылку в свойстве XmlDataProvider Source;

Добавить источник как ресурс в проект

Решение, которое я нашел, заключается в добавлении временного файла (разметка создается с помощью XAML, см. ниже) в проект с действием сборки, установленным на Content Таким образом, приложение перезагружает его каждый раз, когда вы звоните InitializeComponent() на объекте, содержащем XmlDataProvider и мои обновления дерева.

    <XmlDataProvider x:Key="dshPreview" 
                     Source="~tmpConstruct.xml" 
                     XmlNamespaceManager="{StaticResource argNms}"   
                     IsAsynchronous="true"/>

TreeView связан так:

  <TreeView  x:Name="PreviewTree" 
             ItemsSource="{Binding Source={StaticResource dshPreview},
             XPath=/mns:engine/mns:ws}"
              />         

Может быть, это поможет кому-то

Я не нашел, как связать источник сразу, но вы можете изменить исходный код XmlDataProvider в следующем коде:

var xdp = (XmlDataProvider)this.Resources["key-of-your-XmlDataProvider-in-resources"];
xdp.Source = new Uri("http://url-of-your-xml");

Вы можете использовать это в сочетании с обработчиком событий для привязки.

Другие вопросы по тегам