バインディング ソースの概要
更新 : 2007 年 11 月
データ バインディングでは、データの取得元のオブジェクトをバインディング ソース (ソース) オブジェクトと呼びます。このトピックでは、ソースとして使用できるオブジェクトの種類について説明します。
このトピックには次のセクションが含まれています。
- バインディングのソース
- CLR クラスをバインディング ソース オブジェクトとして使用する
- オブジェクト全体をバインディング ソースとして使用する
- コレクション オブジェクトをバインディング ソースとして使用する
- アクセス許可の要件
- 関連トピック
バインディングのソース
Windows Presentation Foundation (WPF) データ バインディングでは、次の種類のバインディング ソースがサポートされます。
バインディング ソース |
説明 |
---|---|
共通言語ランタイム (CLR) オブジェクト |
任意の共通言語ランタイム (CLR) オブジェクトのパブリック プロパティ、サブプロパティ、およびインデクサにバインドできます。バインディング エンジンは、CLR リフレクションを使用してプロパティの値を取得します。また、ICustomTypeDescriptor を実装しているオブジェクトや、登録された TypeDescriptionProvider を持つオブジェクトも、バインディング エンジンと連携できます。 ソース オブジェクトとして使用できるクラスの実装方法の詳細については、次のセクションを参照してください。 |
ADO.NET データ |
DataTable などの ADO.NET オブジェクトにバインドできます。ADO.NET DataView は、IBindingList を実装し、バインディング エンジンがリッスンする変更通知を提供します。 例については、「ADO.NET DataSet のデータとのバインディングのサンプル」を参照してください。 |
XML データ |
XmlNode、XmlDocument、または XmlElement にバインドして、XPath クエリを実行できます。マークアップ内のバインディング ソースである XML データに簡単にアクセスするには、XmlDataProvider オブジェクトを使用します。詳細については、「方法 : XMLDataProvider と XPath クエリを使用して XML データにバインドする」を参照してください。 XElement または XDocument にバインドしたり、XML 用 LINQ を使用してこれらの型のオブジェクトに対して実行したクエリの結果にバインドしたりすることもできます。マークアップ内のバインディング ソースである XML データに簡単にアクセスするには、ObjectDataProvider オブジェクトを使用します。詳細については、「方法 : XDocument、XElement、または LINQ for XML クエリの結果にバインドする」を参照してください。 |
任意の DependencyObject の依存関係プロパティにバインドできます。例については、「方法 : 2 つのコントロールのプロパティをバインドする」を参照してください。 |
CLR クラスをバインディング ソース オブジェクトとして使用する
ここでは、CLR クラスをソース オブジェクトとして使用する目的で実装する場合に認識しておく必要のある事項について説明します。
変更通知を提供する
OneWay または TwoWay バインディング (ソース プロパティが動的に変更される場合は UI を更新する必要がある) を使用している場合は、適切なプロパティ変更通知機構を実装する必要があります。推奨される機構としては、CLR クラスによる INotifyPropertyChanged インターフェイスの実装があります。詳細については、「方法 : プロパティの変更通知を実装する」を参照してください。
INotifyPropertyChanged を実装しない場合は、バインディングで使用されるデータが常に最新の状態を保つように、独自の通知システムを用意する必要があります。変更通知を提供するには、変更を通知する必要のある各プロパティの PropertyChanged パターンをサポートします。このパターンをサポートするには、各プロパティに対して PropertyNameChanged イベントを定義します。ここで、PropertyName はそのプロパティの名前です。プロパティが変更されるたびに、このイベントが発生するようにします。
ソース オブジェクトが適切な通知機構を実装している場合、ターゲットは自動的に更新されます。何らかの理由でソース オブジェクトが適切なプロパティ変更通知を提供しない場合には、UpdateTarget メソッドを使用してターゲット プロパティを明示的に更新することができます。
その他の特性
注意する必要のあるその他の重要な点を、次の一覧に示します。
オブジェクトを XAML で作成する場合、クラスには既定のコンストラクタが必要です。C# などの一部の .NET 言語では、既定のコンストラクタがあらかじめ作成されている場合があります。
バインディングのソース プロパティとして使用するプロパティは、クラスのパブリック プロパティである必要があります。明示的に定義されたインターフェイス プロパティには、基本実装を持たない保護プロパティ、プライベート プロパティ、および仮想プロパティの場合と同様に、バインディングのためにアクセスすることはできません。
CLR クラスのパブリック フィールドにバインドすることはできません。
クラスで宣言したプロパティの型は、バインディングに渡される型です。ただし、バインディングで最終的に使用される型は、ソース プロパティの型ではなく、バインディング ターゲット プロパティの型に依存します。型が異なっている場合は、カスタム プロパティがバインディングに最初に渡される方法を処理するためのコンバータを作成することが考えられます。詳細については、IValueConverter を参照してください。
オブジェクト全体をバインディング ソースとして使用する
オブジェクト全体をバインディングのソースとして使用できます。それには、Source または DataContext プロパティを使用して、オブジェクトをバインディング ソースとして指定し、次に、{Binding} のように、パスを指定せずに空白のバインディング宣言だけにします。この方法が役立つシナリオとしては、型文字列のオブジェクトへのバインディング、必要な複数のプロパティを持つオブジェクトへのバインディング、またはコレクション オブジェクトへのバインディングなどがあります。コレクション オブジェクト全体へのバインディングの例については、「方法 : 階層データでマスタ詳細パターンを使用する」を参照してください。
カスタム ロジックを適用して、バインドしたターゲット プロパティでデータが有効になるようにしなければならない場合があることに注意してください。カスタム ロジックは、カスタム コンバータ (既定の型変換が存在しない場合) のフォーム、または DataTemplate に含まれていなければなりません。コンバータの詳細については、「データ バインディングの概要」の「データ変換」セクションを参照してください。データ テンプレートの詳細については、「データ テンプレートの概要」を参照してください。
コレクション オブジェクトをバインディング ソースとして使用する
多くの場合、ソースとして使用する必要のあるオブジェクトは、複数のカスタム オブジェクトのコレクションで、それぞれのカスタム オブジェクトは、反復されるバインディングの 1 つのインスタンスのソースとして使用されるデータ オブジェクトを表しています。たとえば、複数の CustomerOrder オブジェクトから成る CustomerOrders コレクションがあり、アプリケーションはそのコレクションを反復処理して、存在する注文の数と、各注文に含まれるデータを判別する、という場合があります。
IEnumerable インターフェイスを実装するすべてのコレクションを列挙できます。ただし、コレクションへの挿入や削除によって UI が自動的に更新されるように動的バインディングを設定するには、コレクションで INotifyCollectionChanged インターフェイスを実装する必要があります。このインターフェイスは、基になるコレクションが変更されるたびに発生する必要があるイベントを公開します。
WPF は ObservableCollection<T> クラスを提供します。このクラスは、INotifyCollectionChanged インターフェイスを公開するデータ コレクションの組み込み実装です。コレクション内の個々のデータ オブジェクトは、前の複数のセクションで説明されている要件を満たす必要があります。例については、「方法 : ObservableCollection を作成およびバインドする」を参照してください。独自のコレクションを実装する前に、ObservableCollection<T> または既存のコレクション クラスのいずれか (特に、List<T>、Collection<T>、BindingList<T> など) の使用を検討します。
WPF がコレクションに直接バインドされることはありません。コレクションをデータ ソースとして指定した場合、WPF は実際にはそのコレクションの既定のビューにバインドされます。既定のビューの詳細については、「データ バインディングの概要」を参照してください。
高度なシナリオがあり、独自のコレクションを実装する場合は、IList の使用を検討してください。これにより、インデックスによって個別にアクセスできるオブジェクトの非ジェネリック コレクションが利用可能になり、最適なパフォーマンスが実現されます。
アクセス許可の要件
完全な信頼または部分信頼で実行されているアプリケーションにバインドできるプロパティの種類を次の表に要約します。
プロパティの型 (すべてのアクセス修飾子) |
CLR プロパティ |
CLR プロパティ |
依存関係プロパティ |
[依存関係] property |
---|---|---|---|---|
信頼レベル |
完全信頼 |
部分信頼 |
完全信頼 |
部分信頼 |
パブリック クラス |
○ |
○ |
○ |
○ |
プライベート クラス |
○ |
× |
○ |
○ |
次の表は、データ バインディングで必要とされるアクセス許可についての重要事項の説明です。
CLR プロパティの場合、データ バインディングは、バインディング エンジンがリフレクションを使用してソース プロパティにアクセスできる限り、機能します。それ以外の場合、バインディング エンジンは、プロパティを見つけることができないと警告を発し、可能であればフォールバック値または既定値を使用します。
いつでも依存関係プロパティにバインドできます。
XML バインディングで必要とされるアクセス許可も同様です。部分信頼サンドボックス内で、指定したデータにアクセスするためのアクセス許可がないと、XmlDataProvider は失敗します。
部分信頼セキュリティの詳細については、「Windows Presentation Foundation 部分信頼セキュリティ」を参照してください。
参照
処理手順
概念
LINQ to XML による WPF のデータ バインドの概要