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 确实具有正确的节点。
提前致谢
如果您将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}"/>
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)