FrameworkElement.DataContext プロパティ

定義

FrameworkElement のデータ コンテキストを取得または設定します。 データ コンテキストの一般的な用途は、 FrameworkElement{Binding} マークアップ拡張機能を使用し、データ バインディングに参加する場合です。

public:
 property Platform::Object ^ DataContext { Platform::Object ^ get(); void set(Platform::Object ^ value); };
IInspectable DataContext();

void DataContext(IInspectable value);
public object DataContext { get; set; }
var object = frameworkElement.dataContext;
frameworkElement.dataContext = object;
Public Property DataContext As Object
<frameworkElement DataContext="binding"/>
- or -
<frameworkElement DataContext="{StaticResource keyedObject}"/>

プロパティ値

Object

Platform::Object

IInspectable

データ コンテキストとして使用するオブジェクト。

次の使用例は、DataContext をカスタム クラスのインスタンスに直接設定します。

C++/WinRT{Binding} マークアップ拡張機能を使用している場合は、FrameworkElement::D ataContext プロパティと BindableAttribute を使用します。 {x:Bind} マークアップ拡張機能を使用している場合は、FrameworkElement::D ataContextBindableAttribute も使用しません。

以下の C++/WinRT コード例の背景 (ファイル一覧の使用方法 .idl 、生成する実装ファイルの操作など) については、「 XAML コントロール;C++/WinRT プロパティにバインドする」を参照してください。

// MyColors.idl
namespace MyColorsApp
{
    [bindable]
    [default_interface]
    runtimeclass MyColors : Windows.UI.Xaml.Data.INotifyPropertyChanged
    {
        MyColors();
        Windows.UI.Xaml.Media.SolidColorBrush Brush1;
    }
}

// MyColors.h
#pragma once
#include "MyColors.g.h"
namespace winrt::MyColorsApp::implementation
{
    struct MyColors : MyColorsT<MyColors>
    {
        MyColors() = default;

        Windows::UI::Xaml::Media::SolidColorBrush Brush1();
        void Brush1(Windows::UI::Xaml::Media::SolidColorBrush const& value);
        winrt::event_token PropertyChanged(Windows::UI::Xaml::Data::PropertyChangedEventHandler const& handler);
        void PropertyChanged(winrt::event_token const& token) noexcept;

    private:
        Windows::UI::Xaml::Media::SolidColorBrush m_brush1{ nullptr };
        winrt::event<Windows::UI::Xaml::Data::PropertyChangedEventHandler> m_propertyChanged;
    };
}

namespace winrt::MyColorsApp::factory_implementation
{
    struct MyColors : MyColorsT<MyColors, implementation::MyColors>
    {
    };
}

// MyColors.cpp
#include "pch.h"
#include "MyColors.h"

namespace winrt::MyColorsApp::implementation
{
    Windows::UI::Xaml::Media::SolidColorBrush MyColors::Brush1()
    {
        return m_brush1;
    }

    void MyColors::Brush1(Windows::UI::Xaml::Media::SolidColorBrush const& value)
    {
        if (m_brush1 != value)
        {
            m_brush1 = value;
            m_propertyChanged(*this, Windows::UI::Xaml::Data::PropertyChangedEventArgs{ L"Brush1" });
        }
    }

    winrt::event_token MyColors::PropertyChanged(Windows::UI::Xaml::Data::PropertyChangedEventHandler const& handler)
    {
        return m_propertyChanged.add(handler);
    }

    void MyColors::PropertyChanged(winrt::event_token const& token) noexcept
    {
        m_propertyChanged.remove(token);
    }
}

<!-- MainPage.xaml-->
...
<TextBox x:Name="MyTextBox" Background="{Binding Brush1}"/>
...

// MainPage.h
...
#include "MyColors.h"
#include "MainPage.g.h"
...

// MainPage.cpp
#include "pch.h"
#include "MainPage.h"

using namespace winrt;
using namespace Windows::UI;
using namespace Windows::UI::Xaml;
using namespace Windows::UI::Xaml::Media;

namespace winrt::MyColorsApp::implementation
{
    MainPage::MainPage()
    {
        InitializeComponent();

        // Create an instance of the MyColors class
        // which implements INotifyPropertyChanged.
        winrt::MyColorsApp::MyColors textcolor{ winrt::make<winrt::MyColorsApp::implementation::MyColors>() };

        // Set the Brush1 property value to a new SolidColorBrush
        // with the color Red.
        textcolor.Brush1(SolidColorBrush(Colors::Red()));

        // Set the DataContext of the TextBox named MyTextBox.
        MyTextBox().DataContext(textcolor);
    }
...
}
// Create an instance of the MyColors class 
// that implements INotifyPropertyChanged.
MyColors textcolor = new MyColors();

// Brush1 is set to be a SolidColorBrush with the value Red.
textcolor.Brush1 = new SolidColorBrush(Colors.Red);

// Set the DataContext of the TextBox MyTextBox.
MyTextBox.DataContext = textcolor;
' Create an instance of the MyColors class 
' that implements INotifyPropertyChanged. 
Dim textcolor As New MyColors()

' Brush1 is set to be a SolidColorBrush with the value Red. 
textcolor.Brush1 = New SolidColorBrush(Colors.Red)

' Set the DataContext of the TextBox MyTextBox. 
MyTextBox.DataContext = textcolor

注釈

データ コンテキスト は、オブジェクトリレーションシップ階層内の連続する親オブジェクトからオブジェクトがデータ バインディング情報を継承できる概念です。

データ コンテキストの最も重要な側面は、データ バインディングに使用されるデータ ソースです。 DataContext の一般的な用途は、データ ソース オブジェクトに直接設定することです。 このデータ ソースは、ビジネス オブジェクトなどのクラスのインスタンスである可能性があります。 または、監視可能なコレクションとしてデータ ソースを作成して、データ コンテキストでバッキング コレクション内の変更を検出できるようにします。 データ ソースがプロジェクトにも含まれるライブラリによって定義されている場合、DataContext の設定は、多くの場合、 ResourceDictionary でキー付きリソースとしてデータ ソースをインスタンス化し、 {StaticResource} マークアップ拡張 参照を使用して XAML で DataContext を設定すると組み合わされます。

DataContext を設定するもう 1 つの手法は、 InitializeComponent を呼び出した直後に、アプリ初期化ロジックの一部としてランタイム オブジェクト ツリーのルートに追加することです。 この手法については、「 データ バインディングの概要」を参照してください。

データ コンテキストでは、ソースの指定に加えて、データ ソースへのパスなど、バインド宣言の追加の特性を格納することもできます。

DataContext の設定は、同じオブジェクト上の異なるプロパティの複数のバインドを共有データ コンテキストに設定する場合に便利です。 ただし、DataContext を未定義にし、必要なすべてのバインディング修飾を個別のバインド ステートメントに存在させるのは有効です。

オブジェクト データ ソースを実装する方法は、要件とプログラミング言語によって異なります。 詳しくは、「データ バインディングの詳細」をご覧ください。

C# および Microsoft Visual Basic データ コンテキストの一般的なシナリオは、変更通知をサポートする CLR 定義のビジネス オブジェクトを使用することです。 ビジネス オブジェクトの場合、データ コンテキストとして使用されるカスタム クラスは通常 、INotifyPropertyChanged を実装するため、データの更新によって一方向または双方向のバインディングを更新できます。 データ ソースがビジネス オブジェクトのコレクションである場合は、 INotifyCollectionChanged とリストのサポート (IList または List) を実装するか、 ObservableCollection から派生させることができます。

適用対象

こちらもご覧ください