1

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

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 属性,但是如果它正在工作,它不应该为每个选项卡节点显示 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。

更新:列表框为空

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

提前致谢

4

1 回答 1

4

如果将XmlDataProvider'Document属性设置为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}"/>

在窗口的构造函数中:

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

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

编辑:

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

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

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;
        }
    }
}
于 2010-02-26T19:16:07.163 回答