次の方法で共有


方法: XMLDataProvider クエリと XPath クエリを使用して XML データにバインドする

この例では、 XmlDataProviderを使用して XML データにバインドする方法を示します。

XmlDataProviderでは、アプリケーションのデータ バインディングを介してアクセスできる基になるデータは、XML ノードの任意のツリーにすることができます。 言い換えると、 XmlDataProvider は、XML ノードのツリーをバインディング ソースとして使用する便利な方法を提供します。

次の例では、データは、 セクション内の XML Resourcesとして直接埋め込まれます。 XML データアイランドは、 <x:XData> タグでラップする必要があり、常に 1 つのルート ノード (この例では Inventory ) を持っている必要があります。

XML データのルート ノードには、XML 名前空間を空の文字列に設定する xmlns 属性があります。 これは、XAML ページ内のインラインであるデータ アイランドに XPath クエリを適用するための要件です。 このインラインの場合、XAML とデータ アイランドは、 System.Windows 名前空間を継承します。 このため、XPath クエリが System.Windows 名前空間によって修飾されないようにするには、名前空間を空白に設定する必要があります。これにより、クエリの方向が誤ります。

<StackPanel
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  Background="Cornsilk">

  <StackPanel.Resources>
    <XmlDataProvider x:Key="InventoryData" XPath="Inventory/Books">
      <x:XData>
        <Inventory xmlns="">
          <Books>
            <Book ISBN="0-7356-0562-9" Stock="in" Number="9">
              <Title>XML in Action</Title>
              <Summary>XML Web Technology</Summary>
            </Book>
            <Book ISBN="0-7356-1370-2" Stock="in" Number="8">
              <Title>Programming Microsoft Windows With C#</Title>
              <Summary>C# Programming using the .NET Framework</Summary>
            </Book>
            <Book ISBN="0-7356-1288-9" Stock="out" Number="7">
              <Title>Inside C#</Title>
              <Summary>C# Language Programming</Summary>
            </Book>
            <Book ISBN="0-7356-1377-X" Stock="in" Number="5">
              <Title>Introducing Microsoft .NET</Title>
              <Summary>Overview of .NET Technology</Summary>
            </Book>
            <Book ISBN="0-7356-1448-2" Stock="out" Number="4">
              <Title>Microsoft C# Language Specifications</Title>
              <Summary>The C# language definition</Summary>
            </Book>
          </Books>
          <CDs>
            <CD Stock="in" Number="3">
              <Title>Classical Collection</Title>
              <Summary>Classical Music</Summary>
            </CD>
            <CD Stock="out" Number="9">
              <Title>Jazz Collection</Title>
              <Summary>Jazz Music</Summary>
            </CD>
          </CDs>
        </Inventory>
      </x:XData>
    </XmlDataProvider>
  </StackPanel.Resources>

  <TextBlock FontSize="18" FontWeight="Bold" Margin="10"
    HorizontalAlignment="Center">XML Data Source Sample</TextBlock>
  <ListBox
    Width="400" Height="300" Background="Honeydew">
    <ListBox.ItemsSource>
      <Binding Source="{StaticResource InventoryData}"
               XPath="*[@Stock='out'] | *[@Number>=8 or @Number=3]"/>
    </ListBox.ItemsSource>

    <!--Alternatively, you can do the following. -->
    <!--<ListBox Width="400" Height="300" Background="Honeydew"
      ItemsSource="{Binding Source={StaticResource InventoryData},
      XPath=*[@Stock\=\'out\'] | *[@Number>\=8 or @Number\=3]}">-->

    <ListBox.ItemTemplate>
      <DataTemplate>
        <TextBlock FontSize="12" Foreground="Red">
          <TextBlock.Text>
            <Binding XPath="Title"/>
          </TextBlock.Text>
        </TextBlock>
      </DataTemplate>
    </ListBox.ItemTemplate>
  </ListBox>
</StackPanel>

この例に示すように、属性構文で同じバインド宣言を作成するには、特殊文字を適切にエスケープする必要があります。 詳細については、「 XML 文字エンティティと XAML」を参照してください。

この例を実行すると、 ListBox に次の項目が表示されます。 これらは、Booksのすべての要素のTitleであり、Stock値が"out"、またはNumber値が3以上または8以上であるものです。 で設定されたXPath値は XmlDataProvider 要素のみを公開する必要があることを示しているため、CD 項目は返されません (基本的にフィルターを設定します)。

4 冊の書籍のタイトルを示す XPath の例のスクリーンショット。

この例では、XPathTextBlock バインドのDataTemplateが "Title" に設定されているため、書籍のタイトルが表示されます。 ISBN などの属性の値を表示する場合は、そのXPath値を "@ISBN" に設定します。

WPF の XPath プロパティは、XmlNode.SelectNodes メソッドによって処理されます。 XPath クエリを変更して、さまざまな結果を取得できます。 前の例のバインドされたXPathに対するListBox クエリの例を次に示します。

  • XPath="Book[1]" は、最初の本の要素 ("XML in Action") を返します。 XPath インデックスは 0 ではなく 1 に基づいていることに注意してください。

  • XPath="Book[@*]" は、任意の属性を持つすべての書籍要素を返します。

  • XPath="Book[last()-1]" は、2 番目から最後の book 要素 ("Introducing Microsoft .NET") を返します。

  • XPath="*[position()>3]" は、最初の 3 つを除くすべての book 要素を返します。

XPath クエリを実行すると、XmlNodeまたは XmlNodes の一覧が返されます。 XmlNode は共通言語ランタイム (CLR) オブジェクトです。つまり、 Path プロパティを使用して共通言語ランタイム (CLR) プロパティにバインドできます。 前の例をもう一度考えてみましょう。 この例の残りの部分が同じままで、 TextBlock バインドを次のように変更すると、返された XmlNode の名前が ListBoxに表示されます。 この場合、返されるすべてのノードの名前は "Book" です。

<TextBlock FontSize="12" Foreground="Red">
  <TextBlock.Text>
    <Binding Path="Name"/>
  </TextBlock.Text>
</TextBlock>

一部のアプリケーションでは、XAML ページのソース内に XML をデータ アイランドとして埋め込むのは、コンパイル時にデータの正確な内容を知る必要があるため、不便な場合があります。 そのため、次の例のように、外部 XML ファイルからデータを取得することもサポートされています。

<XmlDataProvider x:Key="BookData" Source="data\bookdata.xml" XPath="Books"/>

XML データがリモート XML ファイルに存在する場合は、次のように適切な URL を Source 属性に割り当てることで、データへのアクセスを定義します。

<XmlDataProvider x:Key="BookData" Source="http://MyUrl" XPath="Books"/>

こちらも参照ください