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::DataContext свойство и BindableAttribute. Если вы используете расширение разметки {x:Bind}, вы не будете использовать и не будете BindableAttributeиспользовать FrameworkElement::DataContext .

Дополнительные сведения о приведенном ниже примере кода 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;

Комментарии

Контекст данных — это концепция, в которой объекты могут наследовать сведения о привязке данных от последовательных родительских объектов в иерархии связей объектов.

Наиболее важным аспектом контекста данных является источник данных, используемый для привязки данных. Обычное использование DataContext заключается в том, чтобы задать его непосредственно объекту источника данных. Этот источник данных может быть экземпляром класса, такого как бизнес-объект. Кроме того, можно создать источник данных в виде наблюдаемой коллекции, чтобы контекст данных мог обнаруживать изменения в резервной коллекции. Если источник данных определяется библиотекой, которая также входит в проект, установка DataContext часто объединяется с создание экземпляра источника данных в качестве ключа ресурса в ResourceDictionary, а затем задание DataContext в XAML с ссылкой на расширение разметки {StaticResource} .

Другим способом настройки DataContext является добавление его в корень дерева объектов среды выполнения в рамках логики инициализации приложения сразу после вызова InitializeComponent. Этот метод показан в обзоре привязки данных.

Помимо указания источника контекст данных также может хранить дополнительные характеристики объявления привязки, например путь к источнику данных.

DataContext Настройка удобной для настройки нескольких привязок разных свойств в одном объекте в контексте общих данных. Однако он является допустимым для DataContext неопределенного определения и для всех необходимых квалификаций привязки, которые должны существовать в отдельных инструкциях привязки.

Реализация источника данных объекта зависит от требований и языка программирования. Дополнительные сведения см. в разделе Подробное изучение привязки данных.

Распространенный сценарий для контекстов данных C# — использовать определенный средой CLR бизнес-объект, поддерживающий уведомление об изменениях. Для бизнес-объекта пользовательский класс, используемый в качестве контекста данных, обычно реализует INotifyPropertyChanged, чтобы обновления данных могли обновлять односторонняя или двусторонняя привязка. Если источник данных является коллекцией бизнес-объектов, он может реализовать поддержку списка INotifyCollectionChanged плюс (IList<T> или List<T>) или получить от ObservableCollection<T>.

Применяется к

См. также раздел