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<T> или List<T>) или получить от ObservableCollection<T>.
Применяется к
См. также раздел
- Binding
- Подробная привязка данных
ObservableCollection< T