Привязать ListBox к XmlDocument
Может ли кто-нибудь мне помочь, почему мой список пуст?
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>
Я знаю, что не настроил привязку к атрибуту имени, но не должен ли он отображать 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.
Я получил это, работая с процедурным кодом с использованием Коллекций, но я пытался выяснить, как связать непосредственно с XML.
Обновление: список пуст
Теперь ошибок привязки нет, но список выводится пустым, я дважды проверил свой XML-файл и даже сделал MessageBox.Show(provider.Document.OuterXML) и могу подтвердить, что XmlDocument имеет правильные узлы.
заранее спасибо
1 ответ
Если вы установите XmlDataProvider
"s 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;
}
}
}