2016-07-19 15 views
1

Ich versuche, eine sehr einfache ListBox Ansicht zu erstellen, die Elemente aus einer kurzen Liste als Beschriftungen anzeigt. Das Fenster wird jedoch leer angezeigt. XAML:Datenbindung an einen XmlDataProvider in XAML zeigt keine Daten an

<Window x:Class="ReCheckList.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    xmlns:local="clr-namespace:ReCheckList" 
    mc:Ignorable="d" 
    Title="MainWindow" Height="298" Width="192"> 
<Window.Resources> 
<!----- Data Source ----------> 
    <XmlDataProvider x:Key="PackingListDataSource" XPath="cList"> 
     <x:XData> 
      <Checklist xmlns=""> 
       <ListNode Title="Socks"/> 
       <ListNode Title="Shoes"/> 
       <ListNode Title="Toothbrush"/> 
      </Checklist> 
     </x:XData> 
    </XmlDataProvider> 
<!--- Data Template -----------> 
    <DataTemplate x:Key="ListNodeTemplate"> 
     <Label Content="{Binding [email protected]}"></Label> 
    </DataTemplate> 
</Window.Resources> 
<Grid> 
<!------ ListBox -------> 
    <ListBox ItemsSource="{Binding Source={StaticResource PackingListDataSource}, XPath=ListNode}" 
      ItemTemplate="{StaticResource ListNodeTemplate}"> 
    </ListBox> 
</Grid> 

Was ist falsch mit meinen Datenbindungen?


EDIT: Der grundlegendste Fehler war, dass die XPath der XmlDataProvider nicht den Wurzelknoten der XML-Daten überein. Das Ändern auf "Checklist" war der einfachste Fix, der keine Änderung meiner XPath Suchparameter erforderte.

+0

Wie sieht die ListNodeTemplate aus? Kann es die ItemsSource-Daten anzeigen? – Mafii

+0

Ihre 'cList' macht keinen Sinn – NSGaga

+0

Das Codebeispiel, das ich mir angesehen habe, das ExpenseIt-Tutorial zu den WPF-Dokumenten, hatte einen' XPath' im 'XmlProvider', also habe ich einen in meinem hinzugefügt. Ich war mir nicht sicher, wie ich es nennen sollte oder was es tut. – mooglinux

Antwort

1

Entfernen Sie zuerst das XPath Attribut aus dem XmlDataProvider

<XmlDataProvider x:Key="PackingListDataSource"> 
    <x:XData> 
     <Checklist xmlns=""> 
      <ListNode Title="Socks"/> 
      <ListNode Title="Shoes"/> 
      <ListNode Title="Toothbrush"/> 
     </Checklist> 
    </x:XData> 
</XmlDataProvider> 

Dann fixieren die XPath in der ItemsSource Bindung, so dass es alle ListNodes in der XML zurückgibt. In der Praxis möchten Sie vielleicht mehr eingrenzen, aber das bringt mir zumindest Artikel in der ListBox.

<ListBox 
    ItemsSource="{Binding Source={StaticResource PackingListDataSource}, XPath='//ListNode'}" 
    ItemTemplate="{StaticResource ListNodeTemplate}" 
    > 
</ListBox> 

// bedeutet "den Baum mit diesem Namen für jedes Element ganzen XML Search". Lassen Sie das hinter sich und suchen Sie nur nach dem Element, das Sie suchen, nach etwas mit diesem Namen. In diesem Fall sehen Sie sich die Wurzel an. Sie können den Pfad im Stammverzeichnis explizit starten, indem Sie den Pfad mit einem einfachen Schrägstrich voranstellen: /CheckList/ListNode.

Alternativ (Ich bin das Lernen, wie ich hier gehen), können Sie die Bindung XPath verlassen, wie Sie es hatte, und ändern Sie einfach den XPath Attribut des XmlDataProvider-Checklist, so wird in Checklist für ListNode Elemente suchen Ihre Bindung. Ihr Problem war wirklich nur, dass cList für das XPath Attribut falsch war, weil Sie nichts cList an der Wurzel Ihres XML haben.

<XmlDataProvider x:Key="PackingListDataSource" XPath="Checklist"> 
    <x:XData> 
     <Checklist xmlns="" Title="Foo"> 
      <ListNode Title="Socks"/> 
      <ListNode Title="Shoes"/> 
      <ListNode Title="Toothbrush"/> 
     </Checklist> 
    </x:XData> 
</XmlDataProvider> 

... 

<ListBox 
    ItemsSource="{Binding Source={StaticResource PackingListDataSource}, XPath='ListNode'}" 
    ItemTemplate="{StaticResource ListNodeTemplate}" 
    > 
</ListBox> 

dass XML Denken Sie daran, ist empfindlich Fall, so Checklist ist nicht CheckList. Und wenn ich sage, dass du dich daran erinnern musst, dann meine ich wirklich, dass ich es vergessen habe.

+0

Ich bin mir nicht sicher, wie 'XPath' funktioniert. Wie ändert das Hinzufügen von '//' die Bindung? – mooglinux

+0

@mooglinux '//' bedeutet "Suche den ganzen Baum nach irgendetwas mit diesem Namen".Lassen Sie das aus, suchen Sie nur das root-Element für Kinder mit diesem Namen. Ich habe damit gespielt, und ich werde meine Antwort mit mehr Details aktualisieren. –

+0

@EdPlunkett: Ich denke, Sie brauchen '/', um tatsächlich auf den Stamm zuzugreifen, 'Name' sollte ein Alias ​​für'./Name' sein, der relativ ist. (Die Frage ist also, ob das implizit relativ zur Wurzel ist.) –

1

ListNode scheint genau wie der falsche XPath hier, meinst du //ListNode oder /Checklist/ListNode? Außerdem setzen Sie eine XPath auf den Provider, der nicht in den Daten erscheint, würde das entfernen.

+0

Ich bin mir nicht sicher, wie XPath funktioniert. Wie ändert das Hinzufügen von '//' die Bindung? – mooglinux

+0

Wenn Sie nicht wissen, dass Sie vor der Verwendung von XPath lernen sollten. '//' findet alle Elemente in der Struktur mit einem gegebenen Namen/Filter. –

0
<!-- change the XPath to "Checklist" --> 
<XmlDataProvider x:Key="PackingListDataSource" XPath="cList"> 
    <x:XData> 
     <Checklist xmlns=""> 
      <ListNode Title="Socks"/> 
      <ListNode Title="Shoes"/> 
      <ListNode Title="Toothbrush"/> 
     </Checklist> 
    </x:XData> 
</XmlDataProvider> 
+0

Wie ist das anders als das, was ich bereits habe? – mooglinux

+0

Die Änderung, die Sie vornehmen müssen, wird im Kommentar notiert: Ändern Sie den XPath in "Checkliste". – Xiaoy312