我有一个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#最简单的方法是什么?
答案 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>
你应该看到这样的事情:
您可以在MSDN上找到有关分层数据模板的更多信息。