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::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.