Поделиться через


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 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 заключается в том, чтобы задать его непосредственно в объекте источника данных. Этот источник данных может быть экземпляром класса, например бизнес-объектом. Или можно создать источник данных в виде наблюдаемой коллекции, чтобы контекст данных мог обнаруживать изменения в резервной коллекции. Если источник данных определяется библиотекой, которая также включена в проект, настройка DataContext часто объединяется с созданием экземпляра источника данных в качестве ресурса с ключом в ResourceDictionary, а затем заданием DataContext в XAML со ссылкой на расширение разметки {StaticResource} .

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

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

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

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

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

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

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