将ListBox绑定到XmlDocument

时间:2010-02-26 15:23:06

标签: c# wpf xml binding xml-binding

有人可以帮助我,为什么我的列表框是空的?

XmlDocument包含以下XML:

<Config>
  <Tabs>
    <Tab Name="Test1" />
    <Tab Name="Test2" />
  </Tabs>
</Config>

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

<Window>
  <Grid>
     <ListBox DataContext="{Binding {StaticResource Data}, XPath=//Tabs}" ItemsSource="{Binding XPath=Tab/@Name}">
     </ListBox>
  </Grid>
<Window>

我知道我没有设置绑定到name属性但是如果每个Tab节点都工作,它不应该显示XmlDocument.XmlNode.ToString()吗?

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

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

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

我使用Collections处理过程代码,但我一直试图弄清楚如何直接绑定到XML。

更新:ListBox为空

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

提前致谢

1 个答案:

答案 0 :(得分:4)

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

在您的XAML中:

Document

在窗口的构造函数中:

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

...

<ListBox 
    DataContext="{Binding {StaticResource Data}, XPath=Config/Tabs}"
    ItemsSource="{Binding XPath=Tab/@Name}"/>

现在,您对InitializeComponent(); XmlDocument d = new XmlDocument(); d.Load("MyData.xml"); XmlDataProvider p = (XmlDataProvider)Resources["Data"]; p.Document = d; 所做的任何更改都会反映在XmlDocument中。

修改

我不能告诉你你做错了什么,但也许你能够将你正在做的事情与下面的事情进行比较,这是一个完整的工作示例。

Window1.xaml:

ListBox

Window1.xaml.cs:

<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>