Wie XML-Attribut zu Treeview Knoten zu binden, während XDocument Datenbindung zu WPF Treeview

StackOverflow https://stackoverflow.com/questions/238196

Frage

Ich habe eine XML, die zu einer WPF TreeView datengebundene werden muss. Hier ist der XML können unterschiedliche Struktur aufweisen. Das TreeView sollte allgemein genug datengebundene werden, um jede Permutation der Hierarchie zu laden. Doch ein XAttribute auf den Knoten (die so genannte Titel ) auf die TreeViewItem Kopftext datengebundene werden und nicht der nodename .

XML gebunden zu sein:

<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>

XAML die Code-Behind, die XML zu XDocument lädt und bindet es an TreeView

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

So in dem XAML-Markup wir Namen TreeViewItem Header verbindlich sind.

<TreeViewItem Header="{Binding Path=Name}"/>

Allerdings möchte ich es binden Titel Attribut Abschnitt, Loop und Seite in der Xml oben. Ich habe gelesen, dass es nicht möglich ist, XPath zu verwenden, während XDocument Bindung. Aber es muss ein Weg sein, um das zu binden Titel Attribut TreeViewItem des Kopftext. Ich habe versucht, mit @Title. [@ Titel] usw. Aber keiner schien zu funktionieren.

Das Gewinde auf MSDN Foren eine ähnliche Diskussion hat.

Alle Hinweise wäre sehr hilfreich.

War es hilfreich?

Lösung

Hurra !!! Ich habe herausgefunden, wie XAttribute zu binden. Es ist nicht intuitiv und es ist nicht leicht vorstellbar. Aber hier ist, wie es getan werden kann.

<TreeViewItem Header="{Binding Path=Attribute[Title].Value}"/>

Es ist schwer vorstellbar, dass Titel kann direkt in eckigen Klammern verwendet werden.

Mehr @ dieser MSDN Link

Andere Tipps

Ich denke, alles, was Sie tun müssen, ist eine HierarchicalDataTemplate für jeden Knotentyp in Ihrem XML, laden sie Ihre xml es in eine XmlDataProvider , und dann binden , die auf die TreeView. Der TV arbeitet mit der XDP-Daten zu binden, und irgendwo entlang der Linie, die sie herausfinden, was HDTS Sie definiert haben, und dessen Datentyp in Ihrem XML, um die Namen der Knoten entsprechen. Sie könnten einige Probleme mit Ihrem XPATHs mit den verschiedenen Arten von Daten zu ändern, aber eine andere Frage diejenigen, flexibel zu halten.

Zum Beispiel, ich habe einen wenig regex Test-App. Es enthält ein Hilfesystem, das in einem Baum enthalten sind im Wesentlichen alle verschiedenen Regex Teile: Kategorien und Teile mit Beschreibungen, Tooltips, und andere Sachen. Die Daten über die Teile als XML-Datenquelle gespeichert. Seit seiner statischen, habe ich nur eine statische Ressource mit den Ressourcen der Anwendung:

<XmlDataProvider
    x:Key="rxPartData"
    XPath="RegexParts">
    <x:XData>
        <RegexParts
            xmlns="">
            <Category
                Name="Character class"
                ToolTip="Sets of characters used in matching">
                <RegexPart
                    Regex="[%]"
                    Hint="Positive character group"
                    ToolTip="Matches any character in the specified group (replace % with one or more characters)" />
                <!-- yadda -->
            </Category>
        </RegexParts>
    </x:XData>
</XmlDataProvider>

Als nächstes ich erstellt HierarchicalDataTemplates für jede Knotentyp in den Daten (wieder, all dies ist in den Ressourcen der Anwendung):

<!-- Category data template -->
<HierarchicalDataTemplate
    DataType="Category"
    ItemsSource="{Binding XPath=*}">
    <TextBlock
        Focusable="False"
        Text="{Binding XPath=@Name}"
        ToolTip="{StaticResource CategoryTooltip}"
        ToolTipService.InitialShowDelay="0"
        ToolTipService.ShowDuration="{x:Static sys:Int32.MaxValue}"
        ToolTipService.HasDropShadow="True" />
</HierarchicalDataTemplate>
<!-- RegexPart data template -->
<HierarchicalDataTemplate
    DataType="RegexPart"
    ItemsSource="{Binding XPath=*}">
    <WrapPanel
        Focusable="False"
        ToolTip="{StaticResource RegexPartTooltip}"
        ToolTipService.InitialShowDelay="0"
        ToolTipService.ShowDuration="{x:Static sys:Int32.MaxValue}"
        ToolTipService.HasDropShadow="True">
        <TextBlock
            Text="{Binding XPath=@Regex}" />
        <TextBlock
            Text=" - " />
        <TextBlock
            Text="{Binding XPath=@Hint}" />
    </WrapPanel>
</HierarchicalDataTemplate>

Schließlich ich gebunden gerade den Baum zum XmlDataProvider:

<TreeView
  Name="_regexParts"
  DockPanel.Dock="Top"
  SelectedItemChanged="RegexParts_SelectedItemChanged"
  ItemsSource="{Binding Source={StaticResource rxPartData}, XPath=/RegexParts/Category}"
  ToolTip="Click the + to expand a category; click a part to insert it">
</TreeView>

Und das ist alles, was Sie zu tun haben. Das TreeView und die XmlDataProvider kümmern zu finden und mit der richtigen HDTs für den richtigen Knoten in den Daten. Der schwierigste Teil des Ganzen ist, herauszufinden, Ihre XPaths für die Bindung. Es kann ein wenig knifflig, als ob die Pfade falsch sind, werden Sie in den Baum immer am Ende nichts, und es wird keine Fehler sein (es gibt Möglichkeiten, die Fehlerberichterstattung in Datenbindung in WPF zu erhöhen, aber das ist eine andere Frage) .

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top