我正在尝试将 TextBlock 绑定到XML文档的元素,如果源是StaticResouce,它可以正常工作,但我无法弄清楚绑定到同一XML文档的语法通过ViewModel公开时。
这是XML文档:
<Books>
<Book ID="1" Name="ABC" />
<Book ID="2" Name="DEF" />
<Book ID="3" Name="XYZ" />
</Books>
绑定到StaticResource = SUCCESSFUL
资源文件包含一个参考Books.xml的XmlDataProvider:
<XmlDataProvider x:Key="data" Source="Books.xml"/>
这就是我如何绑定到xml文件。
<TextBlock Text="{Binding Source={StaticResource data},XPath=/Books/Book/@Name}"/>
<XmlDataProvider x:Key="data" Source="../Views/Data.xml" />
正如我之前所说,上面的绑定工作正常,它显示“ABC”。但是,XmlDocument应该来自SQL Server并通过ViewModel(MVVM Pattern)公开。
绑定到ViewModel = FAILED
ViewModel中的Books属性使用完全相同的XML填充(参见上文):
public XmlDocument Books { get; set; }
这是我用来绑定到ViewModel的语法:
<TextBlock Text="{Binding Books,XPath=/Books/Book/@Name}" />
它没有返回任何内容,我收到以下错误消息:
BindingExpression与XPath无法绑定到非XML对象。
非常感谢任何帮助。
答案 0 :(得分:1)
在绑定到StaticResource的示例中,绑定路径指向一个“适应”您的XmlDocument的XmlDataProvider。而在ViewModel示例中,您的Path是XmlDocument本身。要从ViewModel实现等效绑定,该属性需要公开XmlDataProvider。
答案 1 :(得分:1)
ColinE完全回答了这个问题。但另一个解决方案是暴露属性BookName。
public class ViewModel
{
public ViewModel(XDocument doc)
{
this.Document = doc;
}
private XDocument Document
{
get;
set;
}
public string BookName
{
get
{
return this.Document
.Element("Books")
.Element("Book")
.Attribute("Name").Value;
}
}
然后你应该直接绑定到Name属性:
<TextBlock Text="{Binding BookName}" />
答案 2 :(得分:1)
我在另一个讨论区找到了答案。以下是如何将控件绑定到ViewModel中的XMLDocument属性。
<TextBlock DataContext="{Binding Books}" Text="{Binding XPath=/Books/Book/@Name}"/>
现在我可以成功绑定到来自SQL Server的XML结果。希望能帮助别人解决类似的问题。欢呼声。
答案 3 :(得分:0)
如果您在代码隐藏中绑定到源,则不需要使用XPath。简单路径就可以了。
代码隐藏
this.DataContext = Books;
的Xaml
<TextBlock Text="{Binding Path=Name}"