RelativeSource是一个标记扩展,当我们尝试将对象的属性绑定到对象本身的另一个属性时,在我们尝试将对象的属性绑定到其相对父项的另一个属性时,在特定绑定情况下使用在自定义控件开发的情况下将依赖项属性值绑定到一块XAML时,最后在使用一系列绑定数据的差异的情况下。 所有这些情况都表示为相对源模式。 我将逐一揭露所有这些案件。
模式自我:
想象一下这个案例,我们想要一个矩形,它的高度总是等于它的宽度,一个正方形让我们说。 我们可以使用元素名称来完成此操作
但在上面这种情况下,我们有义务指出绑定对象的名称,即矩形。 我们可以使用RelativeSource以不同的方式达到相同的目的
对于这种情况,我们没有义务提及绑定对象的名称,并且每当高度改变时,宽度将始终等于高度。
如果要将宽度参数设置为高度的一半,则可以通过向Binding标记扩展添加转换器来完成此操作。 我们现在想象另一个案例:
上面的情况用于将给定元素的给定属性绑定到其直接父元素之一,因为此元素包含一个名为Parent的属性。 这导致我们进入另一个相对源模式,即FindAncestor模式。
模式FindAncestor
在这种情况下,给定元素的属性将与其父元素之一Corse绑定。 与上述情况的主要区别在于,由您决定层次结构中的祖先类型和祖先等级来绑定属性。 顺便说一下,尝试使用这块XAML
上面的情况是两个TextBlock元素,它们嵌入在一系列边框中,而canvas元素代表它们的分层父元素。 第二个TextBlock将在相对源级别显示给定父级的名称。
因此,尝试将AncestorLevel = 2更改为AncestorLevel = 1并查看会发生什么。 然后尝试将祖先的类型从AncestorType = Border更改为AncestorType = Canvas,看看发生了什么。
显示的文本将根据Ancestor类型和级别更改。 那么如果祖先级别不适合祖先类型会发生什么? 这是一个很好的问题,我知道你将要问它。 响应是没有异常将被抛出,并且nothings将在TextBlock级别显示。
TemplatedParent
此模式允许将给定的ControlTemplate属性绑定到应用ControlTemplate的控件的属性。 为了更好地理解这个问题,下面是一个例子
Click me
如果我想将给定控件的属性应用于其控件模板,那么我可以使用TemplatedParent模式。 这个标记扩展也有类似的一个,它是TemplateBinding,它是第一个的简写,但TemplateBinding在编译时以TemplatedParent的对比度进行评估,TemplatedParent在第一个运行时之后进行评估。 正如您在下图中所述,背景和内容从按钮内部应用到控件模板。