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 DataContext langsung ke instans kelas kustom.

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

Untuk latar belakang lebih lanjut pada contoh kode C++/WinRT di bawah ini (misalnya, cara menggunakan .idl daftar file, dan apa yang harus dilakukan dengan file implementasi yang dihasilkannya 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;
' 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

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 umum DataContext adalah mengaturnya langsung ke objek sumber data. Sumber data ini mungkin merupakan instans 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, mengatur 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 mengatur DataContext adalah menambahkannya ke akar pohon objek runtime, sebagai bagian dari logika inisialisasi aplikasi, tepat setelah memanggil InitializeComponent. Teknik ini ditunjukkan dalam Gambaran umum pengikatan data.

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

Mengatur DataContext mudah untuk mengatur beberapa pengikatan properti yang berbeda pada objek yang sama ke konteks data bersama. Namun, berlaku agar DataContext tidak 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# dan Microsoft Visual Basic 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 mengimplementasikan dukungan daftar INotifyCollectionChanged plus (IList atau List), atau berasal dari ObservableCollection.

Berlaku untuk

Lihat juga