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