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}"/>
Значение свойства
Объект, используемый в качестве контекста данных.
Примеры
В этом примере напрямую задается 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 или List) или наследовать от ObservableCollection.