Share via


FrameworkElement.DataContext Properti

Definisi

Mendapatkan atau mengatur konteks data untuk FrameworkElement. Penggunaan umum konteks data adalah ketika FrameworkElement menggunakan ekstensi markup {Binding} dan berpartisipasi dalam pengikatan data.

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}"/>

Nilai Properti

Object

Platform::Object

IInspectable

Objek yang digunakan sebagai konteks data.

Contoh

Contoh ini mengatur langsung ke instans DataContext kelas kustom.

Jika Anda menggunakan C++/WinRT dan ekstensi markup {Binding} , maka Anda akan menggunakan FrameworkElement::DataContext properti , dan BindableAttribute. Jika Anda menggunakan ekstensi markup {x:Bind} , maka Anda tidak akan menggunakan FrameworkElement::DataContext atau BindableAttribute.

Untuk latar belakang lebih lanjut tentang contoh kode C++/WinRT di bawah ini (misalnya, cara menggunakan .idl daftar file, dan apa yang harus dilakukan dengan file implementasi yang dihasilkan untuk Anda), lihat kontrol XAML; ikat ke properti 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;

Keterangan

Konteks data adalah konsep di mana objek dapat mewarisi informasi pengikatan data dari objek induk berturut-turut dalam hierarki hubungan objek.

Aspek terpenting dari konteks data adalah sumber data yang digunakan untuk pengikatan data. Penggunaan DataContext umumnya adalah mengaturnya langsung ke objek sumber data. Sumber data ini mungkin merupakan contoh kelas seperti objek bisnis. Atau Anda dapat membuat sumber data sebagai koleksi yang dapat diamati, sehingga konteks data memungkinkan deteksi perubahan dalam koleksi pendukung. Jika sumber data ditentukan oleh pustaka yang juga disertakan dalam proyek, pengaturan DataContext sering dikombinasikan dengan membuat instans sumber data sebagai sumber daya utama dalam ResourceDictionary, lalu mengatur DataContext di XAML dengan referensi ekstensi markup {StaticResource} .

Teknik lain untuk pengaturan DataContext adalah menambahkannya ke akar pohon objek runtime, sebagai bagian dari logika inisialisasi aplikasi, tepat setelah memanggil InitializeComponent. Teknik ini ditampilkan dalam Gambaran umum pengikatan data.

Selain menentukan sumber, konteks data juga dapat menyimpan karakteristik tambahan dari deklarasi pengikatan, seperti jalur ke sumber data.

DataContext Mengatur nyaman untuk mengatur beberapa pengikatan properti yang berbeda pada objek yang sama ke konteks data bersama. Namun, ini berlaku untuk tidak DataContext terdefinisi, dan agar semua kualifikasi pengikatan yang diperlukan ada dalam pernyataan pengikatan terpisah.

Cara Anda menerapkan sumber data objek bervariasi tergantung pada kebutuhan dan bahasa pemrograman Anda. Untuk informasi selengkapnya, lihat Pengikatan data secara mendalam.

Skenario umum untuk konteks data C# adalah menggunakan objek bisnis yang ditentukan CLR yang mendukung pemberitahuan perubahan. Untuk objek bisnis, kelas kustom yang digunakan sebagai konteks data biasanya mengimplementasikan INotifyPropertyChanged, sehingga pembaruan pada data dapat memperbarui pengikatan satu arah atau dua arah. Jika sumber data adalah kumpulan objek bisnis, sumber data dapat menerapkan dukungan daftar INotifyCollectionChanged plus (IList atau List), atau berasal dari ObservableCollection.

Berlaku untuk

Lihat juga