Как связать XmlDataProvider.Source со свойством MVVM
У меня есть дерево, привязанное к XmlDataProvider
следуя этому примеру. Приложение, над которым я работаю, следует шаблону MVVM, а Xml - из файла, который откроет пользователь.
Когда я пытаюсь связать свойство Source XmlDataProvider
вот так
<XmlDataProvider Source="{Binding Path=XmlFilePath}"/>
Я получаю "Привязка может быть применена только к DependencyProperty объекта Dependency". или что-то подобное.
Таким образом, если не связать воедино связывание процедурно, то есть способ декларативно связать XmlDataProvider
Source
? Если я попытаюсь отказаться от поставщика данных и связать дерево непосредственно с 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");
Вы можете использовать это в сочетании с обработчиком событий для привязки.