2010-11-08 35 views
2

我有一个编码像这样的XML文件:简单的方法来XML绑定到树视图在WPF

<?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树视图,使我顶树节点将会说“01.01语音报告”,在“01.01.01语音拦截”之下,每个项目都会显示为树项目。

使用WPF 4和C#做到这一点最简单的方法是什么?

回答

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上的分层数据模板。