如何将控件绑定到ViewModel(MVVM模式)中的XmlDocument元素?

时间:2011-01-22 07:12:28

标签: wpf xaml mvvm binding xmldocument

我正在尝试将 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对象。

非常感谢任何帮助。

4 个答案:

答案 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}"