【问题标题】:Bind ListBox to XmlDocument将 ListBox 绑定到 XmlDocument
【发布时间】:2010-02-26 15:23:06
【问题描述】:

谁能帮帮我,为什么我的列表框是空的?

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 确实有正确的节点.

提前致谢

【问题讨论】:

  • 我还没有对 XML 文档进行任何数据绑定...但是您是否查看了输出窗口以查看是否遇到任何数据绑定错误?
  • 谢谢你,上帝我已经使用数据绑定几个星期了,我总是忘记检查输出窗口。我编辑了我的帖子以添加我的错误,同时我仍在尝试解决这个问题。

标签: c# wpf xml binding xml-binding


【解决方案1】:

如果您将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}"/>

在窗口的构造函数中:

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

【讨论】:

  • 谢谢你,我会在星期一上班,看看它是否有效:)。我猜在 XAML 中没有办法做到这一点(将 xmldataprovider 绑定到 XmlDocument?
  • 对,因为Document属性不是依赖属性,只能绑定依赖属性。
  • WPF 是有史以来最不一致、最令人困惑的微软产品!当我输入 DataContext="{Binding {StaticResource Data}, XPath=Config/Tabs}" 时,我现在得到“无法创建类型为 'Binding' 的实例”,而 google 没有提出任何有成效的东西,请注意关于 Robert 上面的依赖属性 :)
  • 大约 10 分钟后,该错误消失了(因此 WPF 为何如此令人困惑!),但现在我收到以下错误: BindingExpression with XPath cannot bind to non-XML object.; XPath='Config/MarketTabs' 有什么想法吗?
  • 我现在没有收到任何错误消息,但我的 ListBox 空了 :( 有什么想法吗?
猜你喜欢
  • 2012-01-11
  • 1970-01-01
  • 1970-01-01
  • 2013-05-03
  • 2019-12-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-28
相关资源
最近更新 更多