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 ataContextBindableAttribute

有关以下 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 中的键控资源,然后使用 {StaticResource} 标记扩展 引用在 XAML 中设置 DataContext。

设置 DataContext 的另一种方法是在调用 InitializeComponent 之后将其添加到运行时对象树的根目录下,作为应用初始化逻辑的一部分。 数据绑定概述中显示了此方法。

除了指定源外,数据上下文还可以存储绑定声明的其他特征,例如数据源中的路径。

设置 DataContext 便于将同一对象上具有不同属性的多个绑定设置为共享数据上下文。 但是,如果 DataContext 未定义,并且所有必需的绑定限定都存在于单独的绑定语句中,则有效。

实现对象数据源的方式因要求和编程语言而异。 有关详细信息,请参阅深入了解数据绑定

C# 和 Microsoft Visual Basic 数据上下文的常见方案是使用支持更改通知的 CLR 定义的业务对象。 对于业务对象,用作数据上下文的自定义类通常实现 INotifyPropertyChanged,以便对数据的更新可以更新单向或双向绑定。 如果数据源是业务对象的集合,它可以实现 INotifyCollectionChanged 加列表支持 (IListList) ,或派生自 ObservableCollection

适用于

另请参阅