WPF TreeViewにデータバインドする必要がある XML があります。ここで、XML は異なる構造を持つことができます。TreeView は、階層の任意の順列をロードするのに十分なデータバインド ジェネリックである必要があります。ただし、ノードのXAttribute ( Titleと呼ばれる) は、 nodename ではなくTreeViewItem のヘッダー テキストにデータ バインドする必要があります。
バインドする XML:
<Wizard>
<Section Title="Home">
<Loop Title="Income Loop">
<Page Title="Employer Income"/>
<Page Title="Parttime Job Income"/>
<Page Title="Self employment Income"/>
</Loop>
</Section>
<Section Title="Deductions">
<Loop Title="Deductions Loop">
<Page Title="Travel spending"/>
<Page Title="Charity spending"/>
<Page Title="Dependents"/>
</Loop>
</Section>
</Wizard>
XAML:
<Window x:Class="Wpf.DataBinding.TreeViewer"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:Wpf.DataBinding"
Title="TreeViewer" Height="300" Width="300">
<Window.Resources>
<HierarchicalDataTemplate ItemsSource="{Binding Path=Elements}" x:Key="TVTemplate">
<TreeViewItem Header="{Binding Path=Name}"/>
</HierarchicalDataTemplate>
</Window.Resources>
<StackPanel>
<TreeView x:Name="_treeView" Style="{StaticResource TVallExpanded}"
ItemsSource="{Binding Path=Root.Elements}"
ItemTemplate="{StaticResource TVTemplate}" />
</StackPanel>
</Window>
XML を XDocument にロードして TreeView にバインドする XAML の分離コード
public partial class TreeViewer : Window
{
public TreeViewer()
{
InitializeComponent();
XDocument doc = XDocument.Parse(File.ReadAllText(@"C:\MyWizard.xml"));
_treeView.DataContext = doc;
}
}
したがって、XAML マークアップでは、Name を TreeViewItem のヘッダーにバインドしています。
<TreeViewItem Header="{Binding Path=Name}"/>
ただし、上記の Xml の Section、Loop、および Page のTitle属性にバインドしたいと考えています。XDocument のバインド中に XPath を使用することはできないと読みました。ただし、 Title属性を TreeViewItem のヘッダー テキストにバインドする方法が必要です。@Title、.[@Title] などを使用してみましたが、どれも機能していないようです。
MSDN フォーラムのこのスレッドにも同様の議論があります。
どんな指針も大いに役に立ちます。