将列表框绑定到 XmlDocument

Mic*_*han 1 c# xml wpf binding xml-binding

有人可以帮我解决为什么我的列表框是空的吗?

XmlDocument 包含以下 XML:

<Config>
  <Tabs>
    <Tab Name="Test1" />
    <Tab Name="Test2" />
  </Tabs>
</Config>
Run Code Online (Sandbox Code Playgroud)

在我的 XAML 文件中,我尝试了以下操作

<Window>
  <Grid>
     <ListBox DataContext="{Binding {StaticResource Data}, XPath=//Tabs}" ItemsSource="{Binding XPath=Tab/@Name}">
     </ListBox>
  </Grid>
<Window>
Run Code Online (Sandbox Code Playgroud)

我知道我尚未设置与 name 属性的绑定,但是如果它正常工作,是否应该为每个选项卡节点显示 XmlDocument.XmlNode.ToString() ?

我的 C# 构造函数背后的代码:

InitializeComponent();
this.doc = new XmlDocument();
doc.LoadXml(config.document.OuterXml);
XmlDataProvider provider = (XmlDataProvider)Resources["Data"];
provider.Document = doc;
provider.Refresh();
Run Code Online (Sandbox Code Playgroud)

config.document.OuterXml包含上述 xml 的有效文档。

我使用 Collections 处理过程代码,但我一直在尝试找出如何直接绑定到 XML。

更新:列表框为空

现在没有绑定错误,但我的列表框为空,我已经仔细检查了我的 XML 文件,甚至执行了 MessageBox.Show(provider.Document.OuterXML) 并可以确认 XmlDocument 确实具有正确的节点。

提前致谢

Rob*_*ney 5

如果您将XmlDataProviderDocument属性设置为您的,则只要引发事件,XmlDocument它就会刷新绑定。XmlNode.NodeChanged由于Document不是依赖属性,因此您无法绑定它,因此您必须在代码中设置它;这应该可以解决问题:

在您的 XAML 中:

<Window.Resources>
   <XmlDataProvider x:Key="Data"/>
</Window.Resources>

...

<ListBox 
    DataContext="{Binding {StaticResource Data}, XPath=Config/Tabs}"
    ItemsSource="{Binding XPath=Tab/@Name}"/>
Run Code Online (Sandbox Code Playgroud)

在窗口的构造函数中:

InitializeComponent();
XmlDocument d = new XmlDocument();
d.Load("MyData.xml");
XmlDataProvider p = (XmlDataProvider)Resources["Data"];
p.Document = d;
Run Code Online (Sandbox Code Playgroud)

现在,您对遗嘱所做的任何更改XmlDocument都会反映在ListBox.

编辑:

我无法告诉你你做错了什么,但当你将你正在做的事情与下面的内容(这是一个完整的工作示例)进行比较时,也许你就能知道。

窗口1.xaml:

<Window x:Class="Test.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Window1">
    <Window.Resources>
        <XmlDataProvider x:Key="Data"/>
    </Window.Resources>
    <ListBox 
        DataContext="{Binding Source={StaticResource Data}, XPath=Config}" 
        ItemsSource="{Binding XPath=Tabs/Tab/@Name}"/>     
</Window>
Run Code Online (Sandbox Code Playgroud)

Window1.xaml.cs:

using System.Windows;
using System.Windows.Data;
using System.Xml;

namespace Test
{
    public partial class Window1 : Window
    {
        public Window1()
        {
            InitializeComponent();

            XmlDocument d = new XmlDocument();
            string xml = @"<Config><Tabs><Tab Name='foo'/><Tab Name='bar'/></Tabs></Config>";
            d.LoadXml(xml);
            ((XmlDataProvider) Resources["Data"]).Document = d;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)