2

我有一个绑定到XmlDataProvider以下这个示例的树视图。我正在开发的应用程序遵循 MVVM 模式,而 Xml 来自用户将打开的文件。

当我尝试绑定XmlDataProvider类似的 Source 属性时

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

我得到一个“绑定只能应用于依赖对象的依赖属性”。或类似的。

所以没有在程序上将绑定拼凑在一起,有没有办法以声明方式绑定XmlDataProvider Source?如果我尝试放弃数据提供者并将树直接绑定到一个XmlNode属性,我会收到一个关于仅将 XPath 绑定用于 Xml 对象的错误;这对我来说绝对没有意义,但我确信它试图告诉我一些重要的事情。

4

3 回答 3

4

答案似乎是:你不能。

XmlDataProvider通过从等式中删除并将 TreeView 直接绑定到返回 XmlNode 的 ViewModel 属性,我能够解决我的潜在问题(将树视图绑定到 Xml 文档) 。

让我感到困惑的是,我采用了指向 的绑定代码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}">
于 2009-12-09T00:27:32.813 回答
2

实际上这对我来说是一个相当棘手的问题,因为我需要应用程序从临时文件加载树视图,并且假设应用程序可以有不同的位置,我不能在 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}"
              />         

也许这会帮助某人

于 2013-03-26T02:31:06.870 回答
1

我没有找到如何立即绑定源,但是您可以在后面的代码中更改 XmlDataProvider 源,如下所示:

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

您可以将它与事件处理程序结合使用来绑定。

于 2012-10-18T08:49:48.407 回答