Привязать 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;
        }
    }
}
Другие вопросы по тегам