다음을 통해 공유


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를 사용자 지정 클래스의 instance 직접 설정하는 예제입니다.

C++/WinRT{Binding} 태그 확장을 사용하는 경우 FrameworkElement::D ataContext 속성 및 BindableAttribute를 사용합니다. {x:Bind} 태그 확장을 사용하는 경우 FrameworkElement::D ataContext 또는 BindableAttribute를 사용하지 않습니다.

아래 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의 일반적인 사용은 데이터 원본 개체로 직접 설정하는 것입니다. 이 데이터 원본은 비즈니스 개체와 같은 클래스의 instance 수 있습니다. 또는 데이터 컨텍스트가 지원 컬렉션의 변경 내용을 검색할 수 있도록 관찰 가능한 컬렉션으로 데이터 원본을 만들 수 있습니다. 데이터 원본이 프로젝트에 포함된 라이브러리에 의해 정의된 경우 DataContext 설정은 ResourceDictionary에서 데이터 원본을 키 리소스로 인스턴스화한 다음 XAML에서 {StaticResource} 태그 확장 참조를 사용하여 DataContext를 설정하는 것과 결합되는 경우가 많습니다.

DataContext를 설정하는 또 다른 기술은 InitializeComponent를 호출한 직후 앱 초기화 논리의 일부로 런타임 개체 트리의 루트에 추가하는 것입니다. 이 기술은 데이터 바인딩 개요에 나와 있습니다.

데이터 컨텍스트는 원본을 지정하는 것 외에도 데이터 원본에 대한 경로와 같은 바인딩 선언의 추가 특성을 저장할 수 있습니다.

DataContext 설정은 동일한 개체에 있는 여러 속성의 여러 바인딩을 공유 데이터 컨텍스트로 설정하는 데 편리합니다. 그러나 DataContext가 정의되지 않고 필요한 모든 바인딩 자격이 별도의 바인딩 문에 존재하는 것이 유효합니다.

개체 데이터 원본을 구현하는 방법은 요구 사항 및 프로그래밍 언어에 따라 달라집니다. 자세한 내용은 데이터 바인딩 심층 분석을 참조하세요.

C# 및 Microsoft Visual Basic 데이터 컨텍스트의 일반적인 시나리오는 변경 알림을 지원하는 CLR 정의 비즈니스 개체를 사용하는 것입니다. 비즈니스 개체의 경우 데이터 컨텍스트로 사용되는 사용자 지정 클래스는 일반적으로 INotifyPropertyChanged를 구현하므로 데이터에 대한 업데이트가 단방향 또는 양방향 바인딩을 업데이트할 수 있습니다. 데이터 원본이 비즈니스 개체의 컬렉션인 경우 INotifyCollectionChanged 및 목록 지원(IList 또는 List)을 구현하거나 ObservableCollection에서 파생될 수 있습니다.

적용 대상

추가 정보