开发者

Bind ListBox to XmlDocument

Could someone help me out, to why my listbo开发者_开发百科x is empty?

The XmlDocument contains the following XML:

<Config>
  <Tabs>
    <Tab Name="Test1" />
    <Tab Name="Test2" />
  </Tabs>
</Config>

In my XAML file I have tried the following

<Window>
  <Grid>
     <ListBox DataContext="{Binding {StaticResource Data}, XPath=//Tabs}" ItemsSource="{Binding XPath=Tab/@Name}">
     </ListBox>
  </Grid>
<Window>

I know I haven't set up the binding to name attribute but shouldn't this display XmlDocument.XmlNode.ToString() for each Tab Node if it was working?

My C# Constructor Code behind:

InitializeComponent();
this.doc = new XmlDocument();
doc.LoadXml(config.document.OuterXml);
XmlDataProvider provider = (XmlDataProvider)Resources["Data"];
provider.Document = doc;
provider.Refresh();

With config.document.OuterXml being a valid document containing the above xml.

I got this working with procedural code using Collections, but I have been trying to figure out how to bind directly to XML.

Update: ListBox empty

Now there is no binding errors, but my listbox is coming up empty, I have double checked my XML file, and even did MessageBox.Show(provider.Document.OuterXML) and can confirm that the XmlDocument does have the correct nodes.

Thanks in advance


If you set the XmlDataProvider's Document property to your XmlDocument, it will refresh the bindings any time the XmlNode.NodeChanged event is raised. Since Document isn't a dependency property, you can't bind to it, so you have to set it in code; this should do the trick:

In your XAML:

<Window.Resources>
   <XmlDataProvider x:Key="Data"/>
</Window.Resources>

...

<ListBox 
    DataContext="{Binding {StaticResource Data}, XPath=Config/Tabs}"
    ItemsSource="{Binding XPath=Tab/@Name}"/>

In the window's constructor:

InitializeComponent();
XmlDocument d = new XmlDocument();
d.Load("MyData.xml");
XmlDataProvider p = (XmlDataProvider)Resources["Data"];
p.Document = d;

Now any changes you make to your XmlDocument will be reflected in the ListBox.

Edit:

I can't tell you what you're doing wrong, but perhaps you'll be able to when you compare what you're doing with the below, which is a complete working example.

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

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜