为什么将窗口的 DataContext 设置为 {Binding RelativeSource={RelativeSou



根据我的理解,将控件本身设置为DataContext将允许您使用数据绑定访问该控件的属性,而无需指定Source,因此将WindowDataContext设置为{Binding RelativeSource={RelativeSource Self}}应该只允许您将数据绑定到Window类中定义的属性, 不是代码隐藏中的那些,因为代码隐藏文件仅继承了Window类,而我在代码隐藏文件中定义的属性不直接属于Window类。但是,当我这样做时,它神奇地允许我将数据绑定到我在代码隐藏文件中定义的属性。这是如何工作的?

是的,将控件的DataContext设置为自身允许您在Binding中访问其属性。

  • 代码隐藏

    public MyWindow()
    {
    DataContext = this;
    InitializeComponent();
    }
    

    在 XAML 中创建Binding将自动继承此DataContext作为绑定Source,如果未重写,例如,在ItemsControl中将项设置为DataContext

    数据上下文是一个概念,它允许元素从其父元素继承有关用于绑定的数据源的信息,以及绑定的其他特征(如路径)。[...]

  • XAML

    <Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    x:Class="MyWpfApp.MyWindow"
    ...
    DataContext="{Binding RelativeSource={RelativeSource Self}}">
    

    RelativeSource会将BindingSource设置为窗口本身。如果您使用AncestorType={x:Type Window}.

    通过指定绑定源相对于绑定目标位置的位置来获取或设置绑定源。

    不能在单个绑定上设置多个不同的源。

    RelativeSource:相互排斥与ElementNameSource;

从本质上讲,你永远不会在不设置Source的情况下绑定,它是隐式或显式设置的。


如果将Window指定为源,为什么Binding会起作用?您必须了解,XAML 文件和代码隐藏在编译后是同一个类。它们都是在编译时合并的partial定义。你是对的,你继承自Window,但你对绑定的理解是错误的。如果我们谈论类继承,你是对的,通过Window引用访问派生MyWindow将不允许你访问其属性,但绑定不以这种方式工作。它们是将依赖项属性绑定属性耦合的表达式。它们仅在运行时解析,这意味着它们应用于DataContext的实际运行时类型,即MyWindow

将属性值延迟为数据绑定值,创建中间表达式对象并在运行时解释应用于元素及其绑定的数据上下文

您可以分配和切换任意objectDataContext甚至不同类型的。只要任何绑定的Path与任何属性值匹配,它就会成功解析,否则会出现绑定错误。

最新更新