2016-07-19 11 views
1

非常に簡単なListBoxビューを作成して、短いリストのアイテムをラベルとして表示しようとしています。ただし、ウィンドウが空白になります。 XAMLは:XAMLのXmlDataProviderへのデータバインディングでデータが表示されない

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

私のデータバインディングの何が問題になっているのですか?


EDIT:最も基本的なエラーがXmlDataProviderXPathは、XMLデータのルートノードと一致しなかったということでした。 "Checklist"に変更することは、私のXPath検索パラメータの変更を必要とせずに、最も簡単な修正でした。

+0

ListNodeTemplateの外観は何ですか? ItemsSourceデータを表示できますか? – Mafii

+0

あなたの 'cList'は意味をなさない – NSGaga

+0

私が見ていたWPFドキュメントのExpenseItチュートリアルでは、' XmlProvider'に 'XPath'がありました。しかし、私はそれを何と呼ぶべきか、それが何をするのかは分からなかった。 – mooglinux

答えて

1

まず、それはXML内のすべてのListNodesを返すようItemsSourceXPathが結合固定し、その後XmlDataProvider

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

からXPath属性を削除します。実際には、もっと絞り込むこともできますが、これは少なくともListBoxのアイテムを取得します。

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

//「この名前を持つすべての要素の全体のXMLツリーを検索する」を意味します。それを残して、あなたはその名前のものを探している要素だけを探しています。この場合、あなたはルートを見ています。パスの先頭にスラッシュ(/CheckList/ListNode)を付けると、ルートで明示的にパスを開始できます。あなたの結合がListNode要素に対してChecklistになりますので、代わりに

(私はここに行くように、私が学んでいます)、あなたは、あなたがそれを持っていたとして結合XPathを残して、ちょうどChecklistXmlDataProviderXPath属性を変更することができます。あなたの問題は、実際にはcListXPath属性で間違っていたということでした。なぜなら、XMLのルートにcListという名前のものがないからです。

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

は、そのXMLを覚えて大文字と小文字が区別されるので、ChecklistCheckListではありません。あなたがそれを覚えておく必要があると言いますと、私は本当に忘れてしまったことを意味します。

+0

'XPath'の仕組みがわかりません。 '//'を追加するとバインディングがどのように変更されますか? – mooglinux

+0

@mooglinux '//'は "ツリー全体でこの名前のものを検索する"ことを意味します。それを残して、あなたはその名前を持つ子供たちのルート項目を探しているだけです。私はこれを試してきました。私は答えをより詳細に更新するつもりです。 –

+0

@EdPlunkett:ルートに実際にアクセスするには '/'が必要かもしれないと思います。 'Name'は相対的な'。/ Name'のエイリアスでなければなりません。 (だからこそ、それは暗黙的に根に相対的であるかどうかということです。) –

1

ListNodeここで間違ったXPathと同じように見えますが、//ListNodeまたは/Checklist/ListNodeを意味しましたか?また、データに表示されないプロバイダのXPathを設定して削除します。

+0

XPathの仕組みがわかりません。 '//'を追加するとバインディングがどのように変更されますか? – mooglinux

+0

XPathを使用する前にXPathについて学習する必要があるかどうかわからない場合は、 '//'は、指定された名前/フィルタでツリー内のすべての要素を見つけます。 –

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

これは私がすでに持っているものとはどのように異なっていますか? – mooglinux

+0

あなたがしなければならない変更は、コメントに記されています:XPathを「チェックリスト」に変更してください。 – Xiaoy312

関連する問題