根据我的理解,将控件本身设置为DataContext
将允许您使用数据绑定访问该控件的属性,而无需指定Source
,因此将Window
的DataContext
设置为{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
会将Binding
的Source
设置为窗口本身。如果您使用AncestorType={x:Type Window}
.通过指定绑定源相对于绑定目标位置的位置来获取或设置绑定源。
不能在单个绑定上设置多个不同的源。
RelativeSource
:相互排斥与ElementName
和Source
;
从本质上讲,你永远不会在不设置Source
的情况下绑定,它是隐式或显式设置的。
如果将Window
指定为源,为什么Binding
会起作用?您必须了解,XAML 文件和代码隐藏在编译后是同一个类。它们都是在编译时合并的partial
定义。你是对的,你继承自Window
,但你对绑定的理解是错误的。如果我们谈论类继承,你是对的,通过Window
引用访问派生MyWindow
将不允许你访问其属性,但绑定不以这种方式工作。它们是将依赖项属性与绑定属性耦合的表达式。它们仅在运行时解析,这意味着它们应用于DataContext
的实际运行时类型,即MyWindow
。
将属性值延迟为数据绑定值,创建中间表达式对象并在运行时解释应用于元素及其绑定的数据上下文。
您可以分配和切换任意object
,DataContext
甚至不同类型的。只要任何绑定的Path
与任何属性值匹配,它就会成功解析,否则会出现绑定错误。