如何将Xml属性绑定到Treeview节点,同时将XDocument数据绑定到WPF Treeview

Vin*_*Vin 4 c# data-binding wpf treeview xaml

我有一个XML需要数据绑定到WPF TreeView.这里的XML可以有不同的结构.TreeView应该是数据绑定通用的,足以加载任何层次结构的排列.但是,节点上的XAttribute(称为Title)应该数据绑定到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>
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)

XAML的代码隐藏,它将XML加载到XDocument并将其绑定到TreeView

public partial class TreeViewer : Window
{
    public TreeViewer()
    {
        InitializeComponent();
        XDocument doc = XDocument.Parse(File.ReadAllText(@"C:\MyWizard.xml"));
        _treeView.DataContext = doc;
    }
}
Run Code Online (Sandbox Code Playgroud)

因此,在XAML标记中,我们将Name绑定到TreeViewItem的标头.

<TreeViewItem Header="{Binding Path=Name}"/>
Run Code Online (Sandbox Code Playgroud)

但是,我想将它绑定到上面Xml中Section,Loop和Page的Title属性.我读到在绑定XDocument时不可能使用XPath.但必须有一种方法将Title属性绑定到TreeViewItem的Header文本.我尝试使用@Title,.[@ Title]等.但似乎都没有用.

MSDN论坛上的这个主题也有类似的讨论.

任何指针都会非常有用.

Vin*_*Vin 10

华友世界!!! 我想出了如何绑定XAttribute.它不直观,也不容易想象.但这是如何做到的.

<TreeViewItem Header="{Binding Path=Attribute[Title].Value}"/>
Run Code Online (Sandbox Code Playgroud)

很难想象Title可以直接用在方括号中.

更多@这个MSDN链接