次の方法で共有


LINQ to XML を使用した WPF データ バインディングの概要

この記事では、System.Xml.Linq 名前空間の動的データ バインディング機能について説明します。 これらの機能は、Windows Presentation Foundation (WPF) アプリのユーザー インターフェイス (UI) 要素のデータ ソースとして使用できます。 このシナリオは、System.Xml.Linq.XAttributeSystem.Xml.Linq.XElementの特別な 動的プロパティ に依存します。

XAML と LINQ to XML

拡張アプリケーション マークアップ言語 (XAML) は、.NET テクノロジをサポートするために Microsoft によって作成された XML 言語です。 WPF では、ユーザー インターフェイス要素と、イベントやデータ バインディングなどの関連機能を表すために使用されます。 Windows Workflow Foundation では、XAML はプログラム制御 (ワークフロー) などのプログラム構造を表すために使用されます。 XAML を使用すると、テクノロジの宣言的側面を、プログラムのより個別化された動作を定義する関連する手続き型コードから分離できます。

XAML と LINQ to XML は、次の 2 つの方法でやり取りできます。

  • XAML ファイルは整形式の XML であるため、LINQ to XML などの XML テクノロジを使用してクエリと操作を行うことができます。

  • LINQ to XML クエリはデータソースを表しているため、これらのクエリは WPF UI 要素のデータ バインディングのデータ ソースとして使用できます。

このドキュメントでは、2 番目のシナリオについて説明します。

Windows Presentation Foundation のデータ バインディング

WPF データ バインディングを使用すると、UI 要素は、そのプロパティの 1 つをデータ ソースに関連付けることができます。 この簡単な例は、テキストがユーザー定義オブジェクトのパブリック プロパティの値を表す Label です。 WPF データ バインディングは、次のコンポーネントに依存します。

コンポーネント 説明
バインディング ターゲット データ ソースに関連付ける UI 要素。 WPF のビジュアル要素は、UIElement クラスから派生します。
ターゲット属性 データ バインディング ソースの値を反映するバインディング ターゲットの 依存関係プロパティ。 依存関係プロパティは、UIElement 派生元の DependencyObject クラスによって直接サポートされます。
バインディング ソース プレゼンテーション用の UI 要素に提供される 1 つ以上の値のソース オブジェクト。 WPF では、バインド ソースとして、CLR オブジェクト、ADO.NET データ オブジェクト、XML データ (XPath または LINQ to XML クエリからの)、または別の DependencyObjectとして、次の型が自動的にサポートされます。
ソース パス バインドされる値または値のセットに解決されるバインディング ソースのプロパティ。

依存関係プロパティは、UI 要素の動的に計算されるプロパティを表す WPF に固有の概念です。 たとえば、依存関係プロパティには、多くの場合、親要素によって提供される既定値または値があります。 これらの特殊なプロパティは、(標準プロパティと同様にフィールドではなく) DependencyProperty クラスのインスタンスによってサポートされます。 詳細については、「依存関係プロパティの概要」を参照してください。

WPF での動的データ バインディング

既定では、データ バインディングは、ターゲット UI 要素が初期化されている場合にのみ発生します。 これは 一回限り バインディングと呼ばれます。 ほとんどの場合、これは不十分です。通常、データ バインディング ソリューションでは、次のいずれかを使用して、実行時に変更を動的に反映する必要があります。

  • 一方向 バインディング により、一方の側への変更が自動的に反映されます。 最も一般的に、ソースへの変更はターゲットに反映されますが、逆に役立つことがあります。

  • 双方向 バインド では、ソースへの変更がターゲットに自動的に反映され、ターゲットへの変更がソースに自動的に反映されます。

一方向または双方向のバインドを実行するには、ソースで変更通知メカニズムを実装する必要があります。たとえば、INotifyPropertyChanged インターフェイスを実装するか、サポートされている各プロパティに対して PropertyNameChanged パターンを使用します。

WPF でのデータ バインディングの詳細については、「データ バインディング (WPF)」を参照してください。

LINQ to XML クラスの動的プロパティ

ほとんどの LINQ to XML クラスは、適切な WPF 動的データ ソースとして修飾されません。 最も役に立つ情報の一部は、プロパティではなくメソッドでのみ使用でき、これらのクラスのプロパティは変更通知を実装しません。 WPF データ バインディングをサポートするために、LINQ to XML では、一連の 動的プロパティが公開されます。

これらの動的プロパティは、XAttribute クラスおよび XElement クラスの既存のメソッドとプロパティの機能を複製する特別な実行時プロパティです。 これらは、WPF の動的データ ソースとして機能できるようにするためにのみ、これらのクラスに追加されました。 このニーズを満たすために、これらすべての動的プロパティは変更通知を実装します。 これらの動的プロパティの詳細なリファレンスについては、次のセクション「LINQ to XML 動的プロパティ」で説明します。

手記

System.Xml.Linq 名前空間のさまざまなクラスにある標準パブリック プロパティの多くは、1 回限りのデータ バインディングに使用できます。 ただし、ソースもターゲットも、このスキームでは動的に更新されません。

動的プロパティにアクセスする

XAttribute クラスと XElement クラスの動的プロパティには、標準プロパティと同様にアクセスできません。 たとえば、C# などの CLR 準拠言語では、次のことはできません。

  • コンパイル時に直接アクセスされます。 動的プロパティは、コンパイラや Visual Studio IntelliSense では表示されません。

  • .NET リフレクションを使用して実行時に検出またはアクセスされます。 実行時でも、基本的な CLR の意味ではプロパティではありません。

C# では、動的プロパティにアクセスできるのは、System.ComponentModel 名前空間によって提供される機能を通じてのみです。

ただし、一方、XML ソースの動的プロパティには、次の形式の簡単な表記を使用してアクセスできます。

<object>.<dynamic-property>

この 2 つのクラスの動的プロパティは、1 つの値またはインデクサーのいずれかに解決されます。1 つの値の場合は直接使用できますが、インデクサーの場合は、結果の値または値のコレクションを取得するにはインデックスを渡す必要があります。 後者の構文は次の形式になります。

<object>.<dynamic-property>[<index-value>]

詳細については、「LINQ to XML 動的プロパティ 」を参照してください。

WPF 動的バインディングを実装するために、動的プロパティは、System.Windows.Data 名前空間 (特に Binding クラス) によって提供される機能と共に使用されます。

関連項目