バインディング ソースの概要 (WPF .NET)

データ バインディングでは、バインディング ソース オブジェクトは、データの取得元のオブジェクトを表します。 この記事では、.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 クエリにバインドし、XmlNodeXmlDocument、または XmlElement に対して実行できます。 マークアップのバインディング ソースである XML データにアクセスする便利な方法は、XmlDataProvider オブジェクトを使用することです。 詳細については、「XMLDataProvider と XPath クエリを使用して XML データにバインドする (.NET Framework)」を参照してください。

    XElement または XDocument にバインドすることも、LINQ to XML を使用して、これらの型のオブジェクトで実行するクエリの結果にバインドすることも可能です。 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 つの方法があります。

  1. INotifyPropertyChanged インターフェイスを実装します。

    これは、推奨される通知のメカニズムです。 INotifyPropertyChanged は、バインディング システムで優先される PropertyChanged イベントを提供します。 このイベントを発生させ、変更されたプロパティの名前を指定することで、バインディング ターゲットに変更を通知します。

  2. PropertyChanged パターンを実装します。

    バインディング ターゲットに変更を通知する必要がある各プロパティには、対応する PropertyNameChanged イベントがあります。ここで、PropertyName はプロパティの名前です。 プロパティが変更されるたびにイベントが発生します。

バインディング ソースがこれらの通知メカニズムの 1 つを実装する場合、ターゲットの更新が自動的に発生します。 何らかの理由でバインディング ソースが適切なプロパティ変更通知を提供しない場合、UpdateTarget メソッドを使用してターゲット プロパティを明示的に更新できます。

その他の特性

その他の重要な点を次に示します。

  • バインディング ソースとして機能するデータ オブジェクトは、パラメーターのないコンストラクター があれば、XAML でリソースとして宣言できます。 それ以外の場合は、コードでデータ オブジェクトを作成し、XAML オブジェクト ツリーのデータ コンテキストに直接割り当てるか、バインディングのバインディング ソースとして割り当てる必要があります。

  • バインディング ソース プロパティとして使用するプロパティは、クラスのパブリック プロパティである必要があります。 明示的に定義されたインターフェイスのプロパティは、バインディングの目的ではアクセスできません。また、基本実装を持たない保護されたプロパティ、プライベート プロパティ、内部プロパティ、仮想プロパティも同様にバインディングの目的ではアクセスできません。

  • パブリック フィールドにバインドすることはできません。

  • クラスで宣言されたプロパティの型は、バインディングに渡される型です。 ただし、最終的にバインディングによって使用される型は、バインディング ソース プロパティの型ではなく、バインディング ターゲット プロパティの型によって決まります。 型の違いがある場合は、バインディングにカスタム プロパティを最初に渡す方法を処理するコンバーターを作成する必要があります。 詳細については、「IValueConverter」を参照してください。

バインディング ソースとしてのオブジェクト全体

バインディング ソースとしてオブジェクト全体を使用できます。 Source または DataContext プロパティを使用してバインディング ソースを指定し、空のバインディング宣言 {Binding} を提供します。 これが便利なシナリオには、文字列型のオブジェクトへのバインディング、対象とするプロパティが複数あるオブジェクトへのバインディング、またはコレクション オブジェクトへのバインディングなどがあります。 コレクション オブジェクト全体へのバインディングの例は、「階層データでマスター詳細パターンを使用する方法 (.NET Framework)」を参照してください。

バインディング ターゲット プロパティに対してデータが意味を持つように、カスタム ロジックを適用することが必要になる場合があります。 カスタム ロジックはカスタム コンバーターまたは DataTemplate の形式にすることができます。 コンバーターの詳細については、「データ変換」を参照してください。 データ テンプレートの詳細については、「データ テンプレートの概要 (.NET Framework)」を参照してください。

バインディング ソースとしてのコレクション オブジェクト

多くの場合、バインディング ソースとして使用するオブジェクトは、カスタム オブジェクトのコレクションです。 各オブジェクトは、反復されるバインディングの 1 つのインスタンスのソースとして機能します。 たとえば、CustomerOrder オブジェクトから構成される CustomerOrders コレクションがあり、アプリケーションが注文数およびそれぞれの注文に含まれているデータを判別するためにコレクションとやり取りするとします。

IEnumerable インターフェイスを実装する任意のコレクションを列挙できます。 ただし、コレクションの挿入または削除によって UI が自動的に更新されるように動的バインドを設定するには、コレクションは INotifyCollectionChanged インターフェイスを実装する必要があります。 このインターフェイスは、基盤のコレクションが変更されたときに必ず発生する必要があるイベントを公開します。

ObservableCollection<T> クラスは、INotifyCollectionChanged インターフェイスを公開するデータ コレクションの組み込みの実装です。 コレクション内の個々のデータ オブジェクトは、前の各セクションで説明されている要件を満たす必要があります。 例については、「ObservableCollection を作成およびバインドする方法 (.NET Framework)」を参照してください。 独自のコレクションを実装する前に、ObservableCollection<T> または既存のコレクション クラス (List<T>Collection<T>BindingList<T> など) のいずれかを使用することを検討してください。

コレクションをバインディング ソースとして指定すると、WPF は直接コレクションにバインドしません。 代わりに、WPF は実際にはコレクションの既定のビューにバインドします。 既定のビューの詳細については、「既定のビューの使用」を参照してください。

高度なシナリオで独自のコレクションを実装する場合、IList インターフェイスの使用を検討します。 このインターフェイスでは、インデックスによって個別にアクセスできるオブジェクトの一般的ではないコレクションが提供され、パフォーマンスを向上できます。

データ バインディングでのアクセス許可要件

.NET Framework とは異なり、.NET は完全信頼セキュリティで実行されます。 すべてのデータ バインディングは、アプリケーションを実行しているユーザーと同じアクセス権で実行されます。

関連項目