この例では、XDocumentを使用して XML データを ItemsControl にバインドする方法を示します。
例
次の XAML コードは、ItemsControl を定義し、http://planetsNS
XML 名前空間に Planet
型のデータ用のデータ テンプレートを含みます。 名前空間を占有する XML データ型には、名前空間を中かっこで囲む必要があります。XAML マークアップ拡張が出現する可能性がある場所に表示される場合は、名前空間の前に中かっこエスケープ シーケンスを付ける必要があります。 このコードは、XElement クラスの Element メソッドと Attribute メソッドに対応する動的プロパティにバインドされます。 動的プロパティを使用すると、XAML はメソッドの名前を共有する動的プロパティにバインドできます。 詳細については、LINQ to XML 動的プロパティを参照してください。 XML の既定の名前空間宣言が属性名に適用されないことに注意してください。
<StackPanel Name="stacky">
<StackPanel.Resources>
<DataTemplate DataType="{}{http://planetsNS}Planet" >
<StackPanel Orientation="Horizontal">
<TextBlock Width="100" Text="{Binding Path=Element[{http://planetsNS}DiameterKM].Value}" />
<TextBlock Width="100" Text="{Binding Path=Attribute[Name].Value}" />
<TextBlock Text="{Binding Path=Element[{http://planetsNS}Details].Value}" />
</StackPanel>
</DataTemplate>
</StackPanel.Resources>
<ItemsControl
ItemsSource="{Binding }" >
</ItemsControl>
</StackPanel>
次の C# コードは、Load を呼び出し、スタック パネルのデータ コンテキストを、http://planetsNS
XML 名前空間の SolarSystemPlanets
という名前の要素のすべてのサブ要素に設定します。
planetsDoc = XDocument.Load("../../Planets.xml");
stacky.DataContext = planetsDoc.Element("{http://planetsNS}SolarSystemPlanets").Elements();
planetsDoc = XDocument.Load("../../Planets.xml")
stacky.DataContext = planetsDoc.Element("{http://planetsNS}SolarSystemPlanets").Elements()
XML データは、ObjectDataProviderを使用して XAML リソースとして格納できます。 完全な例については、L2DBForm.xaml ソース コード
planetsDoc = (XDocument)((ObjectDataProvider)Resources["justTwoPlanets"]).Data;
stacky.DataContext = planetsDoc.Element("{http://planetsNS}SolarSystemPlanets").Elements();
planetsDoc = CType((CType(Resources("justTwoPlanets"), ObjectDataProvider)).Data, XDocument)
stacky.DataContext = planetsDoc.Element("{http://planetsNS}SolarSystemPlanets").Elements()
Element および Attribute にマップされる動的プロパティは、XAML 内で柔軟性を提供します。 コードは、LINQ for XML クエリの結果にバインドすることもできます。 この例では、要素値で並べ替えられたクエリ結果にバインドします。
stacky.DataContext =
from c in planetsDoc.Element("{http://planetsNS}SolarSystemPlanets").Elements()
orderby Int32.Parse(c.Element("{http://planetsNS}DiameterKM").Value)
select c;
stacky.DataContext = From c In planetsDoc.Element("{http://planetsNS}SolarSystemPlanets").Elements()
Order By Int32.Parse(c.Element("{http://planetsNS}DiameterKM").Value)
Select c
関連項目
- バインディング ソースの概要
- LINQ to XML による WPF のデータ バインディングの概要
- LINQ to XML を使用した WPF データ バインディングの 例
- LINQ to XML の動的プロパティ
.NET Desktop feedback