Привязать ListBox к XmlDocument - PullRequest
1 голос
/ 26 февраля 2010

Может ли кто-нибудь мне помочь, почему мой список пуст?

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.

Обновление: ListBox пуст

Теперь ошибок привязки нет, но список выводится пустым, я дважды проверил свой XML-файл и даже сделал MessageBox.Show (provider.Document.OuterXML) и могу подтвердить, что XmlDocument имеет правильные узлы .

Заранее спасибо

1 Ответ

4 голосов
/ 26 февраля 2010

Если вы установите 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.

Edit:

Я не могу сказать вам, что вы делаете неправильно, но, возможно, вы сможете, когда вы сравните то, что вы делаете с приведенным ниже, что является полным рабочим примером.

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;
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...