データ バインディングでは、バインディング ソース オブジェクトは、データの取得元のオブジェクトを参照します。 この記事では、.NET CLR オブジェクト、XML、 DependencyObject オブジェクトなど、バインディング ソースとして使用できるオブジェクトの種類について説明します。
バインディング ソースの種類
Windows Presentation Foundation (WPF) データ バインディングでは、次のバインディング ソースの種類がサポートされています。
.NET 共通言語ランタイム (CLR) オブジェクト
共通言語ランタイム (CLR) オブジェクトのパブリック プロパティ、サブプロパティ、インデクサーにバインドできます。 バインディング エンジンは、CLR リフレクションを使用してプロパティの値を取得します。 ICustomTypeDescriptorを実装するオブジェクト、または登録されたTypeDescriptionProviderを持つオブジェクトは、バインド エンジンでも動作します。
バインディング ソースとして機能するクラスを実装する方法の詳細については、この記事の後半の 「オブジェクトにバインド ソースを実装 する」を参照してください。
動的オブジェクト
IDynamicMetaObjectProvider インターフェイスを実装するオブジェクトの使用可能なプロパティとインデクサーにバインドできます。 コードでメンバーにアクセスできる場合は、それにバインドできます。 たとえば、動的オブジェクトが
SomeObject.AProperty
を介してコード内のメンバーにアクセスできる場合は、バインド パスをAProperty
に設定してバインドできます。ADO.NET オブジェクト
DataTableなどの ADO.NET オブジェクトにバインドできます。 ADO.NET DataView は、バインディング エンジンがリッスンする変更通知を提供する IBindingList インターフェイスを実装します。
XML オブジェクト
XPath
のクエリをXmlNode、XmlDocument、またはXmlElementにバインドして実行できます。 マークアップのバインディング ソースである XML データにアクセスする便利な方法は、 XmlDataProvider オブジェクトを使用することです。 詳細については、「 XMLDataProvider クエリと XPath クエリを使用した XML データへのバインド (.NET Framework)」を参照してください。また、LINQ to XML を使用して、 XElement または XDocumentにバインドしたり、これらの型のオブジェクトに対して実行されるクエリの結果にバインドしたりすることもできます。 LINQ to XML を使用してマークアップのバインド ソースである XML データにアクセスする便利な方法は、 ObjectDataProvider オブジェクトを使用することです。 詳細については、「 XDocument、XElement、または LINQ for XML クエリ結果へのバインド (.NET Framework)」を参照してください。
DependencyObject オブジェクト
任意の DependencyObjectの依存関係プロパティにバインドできます。 例については、「 2 つのコントロールのプロパティのバインド (.NET Framework)」を参照してください。
オブジェクトにバインド ソースを実装する
CLR オブジェクトはバインディング ソースになる可能性があります。 バインディング ソースとして機能するクラスを実装する際に注意すべき点がいくつかあります。
変更通知を提供する
OneWayまたはTwoWay バインディングのいずれかを使用している場合は、適切な "プロパティの変更" 通知メカニズムを実装します。 CLR または動的クラスが INotifyPropertyChanged インターフェイスを実装するためのメカニズムをお勧めします。 詳細については、「 方法: プロパティ変更通知を実装する (.NET Framework)」を参照してください。
プロパティの変更をサブスクライバーに通知するには、次の 2 つの方法があります。
INotifyPropertyChanged インターフェイスを実装します。
これは、通知に推奨されるメカニズムです。 INotifyPropertyChangedは、バインディング システムが考慮するPropertyChanged イベントを提供します。 このイベントを発生させ、変更されたプロパティの名前を指定することで、バインディング ターゲットに変更を通知します。
PropertyChanged
パターンを実装します。バインド ターゲットに変更されたことを通知する必要がある各プロパティには、対応する
PropertyNameChanged
イベントがあり、PropertyName
はプロパティの名前です。 プロパティが変更されるたびにイベントを発生させます。
バインディング ソースでこれらの通知メカニズムのいずれかが実装されている場合、ターゲットの更新は自動的に行われます。 何らかの理由でバインディング ソースが適切なプロパティ変更通知を提供しない場合は、 UpdateTarget メソッドを使用してターゲット プロパティを明示的に更新できます。
その他の特性
次の一覧に、注意すべきその他の重要なポイントを示します。
バインディング ソースとして機能するデータ オブジェクトは、 パラメーターなしのコンストラクターがあれば、XAML でリソースとして宣言できます。 それ以外の場合は、コードでデータ オブジェクトを作成し、XAML オブジェクト ツリーのデータ コンテキストまたはバインドのバインディング ソースとして直接割り当てる必要があります。
バインディング ソース プロパティとして使用するプロパティは、クラスのパブリック プロパティである必要があります。 明示的に定義されたインターフェイス プロパティには、バインドの目的でアクセスすることも、基本実装のない保護、プライベート、内部、または仮想のプロパティにアクセスすることもできません。
パブリック フィールドにバインドすることはできません。
クラスで宣言されたプロパティの型は、バインディングに渡される型です。 ただし、バインディングによって最終的に使用される型は、バインディング ソース プロパティではなく、バインディング ターゲット プロパティの型によって異なります。 型に違いがある場合は、カスタム プロパティがバインディングに最初に渡される方法を処理するコンバーターを記述できます。 詳細については、IValueConverterを参照してください。
バインディング ソースとしてのオブジェクト全体
オブジェクト全体をバインディング ソースとして使用できます。
Sourceまたは DataContext プロパティを使用してバインディング ソースを指定し、空のバインド宣言を指定します:{Binding}
。 これが役立つシナリオとしては、文字列型のオブジェクトへのバインド、関心のある複数のプロパティを持つオブジェクトへのバインド、コレクション オブジェクトへのバインドなどがあります。 コレクション オブジェクト全体にバインドする例については、「 階層データで Master-Detail パターンを使用する方法 (.NET Framework)」を参照してください。
バインドされたターゲット プロパティにデータが意味を持つよう、カスタム ロジックを適用することが必要になる場合があります。 カスタム ロジックは、カスタム コンバーターまたは DataTemplateの形式にすることができます。 コンバーターの詳細については、「 データ変換」を参照してください。 データ テンプレートの詳細については、「 データ テンプレートの概要 (.NET Framework)」を参照してください。
バインディング ソースとしてのコレクション オブジェクト
多くの場合、バインディング ソースとして使用するオブジェクトは、カスタム オブジェクトのコレクションです。 各オブジェクトは、繰り返しバインドの 1 つのインスタンスのソースとして機能します。 たとえば、CustomerOrders
オブジェクトで構成されるCustomerOrder
コレクションがある場合、アプリケーションはコレクションを反復処理して、存在する注文の数と各注文に含まれるデータを決定します。
IEnumerable インターフェイスを実装する任意のコレクションを列挙できます。 ただし、コレクション内の挿入または削除によって UI が自動的に更新されるように動的バインディングを設定するには、コレクションで INotifyCollectionChanged インターフェイスを実装する必要があります。 このインターフェイスは、基になるコレクションが変更されるたびに発生する必要があるイベントを公開します。
ObservableCollection<T> クラスは、INotifyCollectionChanged インターフェイスを公開するデータ コレクションの組み込み実装です。 コレクション内の個々のデータ オブジェクトは、前のセクションで説明した要件を満たす必要があります。 例については、「 ObservableCollection (.NET Framework) を作成してバインドする方法」を参照してください。 独自のコレクションを実装する前に、ObservableCollection<T>、List<T>、Collection<T>など、BindingList<T>または既存のコレクション クラスの 1 つを使用することを検討してください。
コレクションをバインド ソースとして指定した場合、WPF はコレクションに直接バインドしません。 代わりに、WPF は実際にコレクションの既定のビューにバインドします。 既定のビューの詳細については、「 既定のビューの使用」を参照してください。
高度なシナリオがあり、独自のコレクションを実装する場合は、 IList インターフェイスの使用を検討してください。 このインターフェイスは、インデックスによって個別にアクセスできるオブジェクトの非ジェネリック コレクションを提供し、パフォーマンスを向上させることができます。
データ バインディングのアクセス許可の要件
.NET Framework とは異なり、.NET は完全信頼セキュリティで実行されます。 すべてのデータ バインディングは、アプリケーションを実行しているユーザーと同じアクセス権で実行されます。
こちらも参照ください
.NET Desktop feedback