在WPF中将XML绑定到Treeview的简便方法

时间:2010-11-08 00:19:31

标签: c# wpf xml treeview

我有一个XML文件,编码如下:

<?xml version="1.0" encoding="us-ascii"?>
<xml>
<Section ref="01.01" name="Voice Reports">
    <Subsection ref="01.01.01" name="Voice Blocking">
        <Item ref="01.01.01.01" name="CCH Block Count">
            <Description>CCH Block Count</Description>
            <Formula>({#001001_SEIZ_ATTEMPTS_WITH_BUSY_SDCCH})</Formula>
            <Units>Count</Units>
        </Item>
        <Item ref="01.01.01.02" name="CCH Call Attempts">
            <Description>CCH Call Attempts</Description>
            <Formula>({#001000_SEIZ_ATTEMPTS})</Formula>
            <Units>Count</Units>
        </Item>
    </Subsection>
</Section>
</xml>

我想要做的是将它绑定到WPF中的TreeView,以便我的顶级树节点将显示“01.01语音报告”,并在“01.01.01语音阻止”下,并在其下将每个项目作为树项目。

使用WPF 4和C#最简单的方法是什么?

1 个答案:

答案 0 :(得分:2)

执行此操作的一种方法是在使用HierarchicalDataTemplates进行数据绑定之前读取XML并转换为对象。

请注意,在下面的代码中,我没有做太多的错误检查。我将您的XML直接复制到XMLFile1.xml。

MainWindow.xaml.cs:

using System.Collections.Generic;
using System.Linq;
using System.Windows;
using System.Xml.Linq;

namespace WpfApplication
{
    public class Attributes
    {
        public string Ref { get; set; }
        public string Name { get; set; }
        public override string ToString()
        {
            return Ref + " " + Name;
        }
    }

    public class Section
    {
        public Attributes Attributes { get; set; }
        public List<SubSection> SubSections { get; set; }
    }

    public class SubSection
    {
        public Attributes Attributes { get; set; }
        public List<Item> Items { get; set; }
    }

    public class Item
    {
        public Attributes Attributes { get; set; }
        public string Description { get; set; }
        public string Units { get; set; }
        public string Formula { get; set; }

    }

    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            LoadFile();
            DataContext = this;
        }

        public List<Section> Sections
        {
            get;
            private set;
        }

        private void LoadFile()
        {
            XDocument xmlFile = XDocument.Load(@"XMLFile1.xml");

            var q = from section in xmlFile.Descendants("Section")
                    select new Section()
                    {
                        Attributes = new Attributes() 
                        {
                            Ref = section.Attribute("ref").Value,
                            Name = section.Attribute("name").Value 
                        },
                        SubSections = new List<SubSection>(from subsection in section.Descendants("Subsection")
                                      select new SubSection()
                                      {
                                          Attributes = new Attributes()
                                          {
                                              Ref = subsection.Attribute("ref").Value,
                                              Name = subsection.Attribute("name").Value
                                          },
                                          Items = new List<Item>(from item in subsection.Descendants("Item")
                                                   select new Item()
                                                   {
                                                       Attributes = new Attributes()
                                                       {
                                                           Ref = item.Attribute("ref").Value,
                                                           Name = item.Attribute("name").Value
                                                       },
                                                       Description = item.Element("Description").Value,
                                                       Formula = item.Element("Formula").Value,
                                                       Units = item.Element("Units").Value
                                                   })
                                      })
                    };

            Sections = new List<Section>(q);
        }
    }
}

XAML文件(MainWindow.xaml):

<Window x:Class="WpfApplication.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:src="clr-namespace:WpfApplication"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <Grid.Resources>
            <HierarchicalDataTemplate DataType = "{x:Type src:Section}"
                                ItemsSource = "{Binding Path=SubSections}">
                <StackPanel Orientation="Horizontal">
                    <TextBlock Text="{Binding Path=Attributes}"/>
                </StackPanel>
            </HierarchicalDataTemplate>
            <HierarchicalDataTemplate DataType = "{x:Type src:SubSection}"
                                ItemsSource = "{Binding Path=Items}">
                <StackPanel Orientation="Horizontal">
                    <TextBlock Text="{Binding Path=Attributes}"/>
                </StackPanel>
            </HierarchicalDataTemplate>
            <DataTemplate DataType = "{x:Type src:Item}">
                <StackPanel Orientation="Horizontal">
                    <TextBlock Text="{Binding Path=Attributes}"/>
                    <TextBlock Text="    " />
                    <TextBlock Text="{Binding Path=Description}" />
                    <TextBlock Text=" " />
                    <TextBlock Text="{Binding Path=Formula}" />
                    <TextBlock Text=" " />
                    <TextBlock Text="{Binding Path=Units}" />
                </StackPanel>
            </DataTemplate>
        </Grid.Resources>

        <TreeView ItemsSource="{Binding Sections}" />
    </Grid>
</Window>

你应该看到这样的事情: MainWindow

您可以在MSDN上找到有关分层数据模板的更多信息。