我们进行Bingding时,如果明确知道数据源的Name,就能用Source或者ElementName进行绑定,但是有时候我们需要绑定的数据源可能没有明确的Name,此时我们就需要利用Bingding的RelativeSource进行绑定。
一、控件关联自身的属性
<Window x:Class="_6_27.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Grid x:Name="g1" Background="Red" Margin="10">
<DockPanel Name="d1" Background="Orange" Margin="10">
<Grid x:Name="g2" Background="Yellow" Margin="10">
<DockPanel Name="d2" Background="LawnGreen" Margin="10">
<TextBox Name="textbox" FontSize="24" Margin="10"
Text="{Binding RelativeSource={RelativeSource Mode=Self},Path=Name}"/>
</DockPanel>
</Grid>
</DockPanel>
</Grid>
</Window>
关联控件本身的属性时,只需要设置RelativeSource的Mode=Self即可。
其等效的cs代码:
RelativeSource rs = new RelativeSource();
rs.Mode = RelativeSourceMode.Self;
Binding binding = new Binding("Name") { RelativeSource = rs };
this.textbox.SetBinding(TextBox.TextProperty, binding);
运行效果如下:
二、控件关联其父级容器的属性
<Window x:Class="_6_27.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Grid x:Name="g1" Background="Red" Margin="10">
<DockPanel Name="d1" Background="Orange" Margin="10">
<Grid x:Name="g2" Background="Yellow" Margin="10">
<DockPanel Name="d2" Background="LawnGreen" Margin="10">
<TextBox Name="textbox" FontSize="24" Margin="10"
Text="{Binding RelativeSource={RelativeSource Mode=FindAncestor,AncestorType={x:Type Grid},AncestorLevel=1},Path=Name}"/>
</DockPanel>
</Grid>
</DockPanel>
</Grid>
</Window>
RelativeSource属性的数据类型为RelativeSource类,AncestorLevel指的是以Bingding目标控件为起点的层级偏移量,d2的偏移量是1,g2的偏移量是2,AncestorType指的是要找的目标对象的类型。值得注意的是AncestorLevel需要参考AncestorType使用,如上面设置了AncestorType={x:Type Grid},则Bingding在寻找时会忽略非Grid的控件,此时g2的偏移量是1,g1的偏移量是2,DockPanel被忽略。
当一个
Binding
有明确的数据来源时可以通过为
Source
或ElementName赋值的办法让
Binding
与之关联,有的时候由于不能确定
Source
的对象叫什么名字,但知道它与作为
Binding
目标的对象在UI布局上有相对关系,比如控件自己关联自己的某个数据、关联自己某级容器的数据,就要
使用
Binding
的Re
lative
Source
属性。Re
lative
Source
属性的数据类型为Relat
Re
lative
Source
是一个标记扩展,扩展描述相对于绑定目标位置的绑定源位置。Re
lative
Source
作用是改变绑定指向的源,默认
使用
绑定的源是对应的DataContext对象
中
的属性,如果想要绑定源为其他元素,比如自身、其他父级控件、其他ViewModel,就需要用Re
lative
Source
进行标记。它表示在绑定表达式
中
引用另一个元素的属性。它使开发人员可以根据元素的位置和类型来查找绑定源。属性解释以模式获取或设置要查找的上级级别。
使用
1 指示最靠近绑定目标元素的项。
Binding
是
WPF
应用程序
中
的一种机制,它为应用程序提供了一种简单易用的方式来显示数据并与之交互。它允许数据在 UI 和业务模型之间流动。绑定完成后对业务模型
中
的数据所做的任何修改都会自动反映到 UI,反之亦然。
绑定可以是单向的或双向的。数据绑定的源可以是普通的 .NET 属性或 Dependency 属性,但目标属性必须是Dependency属性。
为了使绑定正常工作,属性的双方都必须提供通知
中
的更改,这将告诉绑定更新目标值。在普通的 .NET 属性
中
,可以通过
使用
INotifyPorpert
当我们想未一个控件绑定值的时候,我们需要将某个控件的数据绑定到指定的控件上,就可以用Re
lative
Source
。XAML代码<Window x:Class="
使用
Binding
的Re
lative
Source
.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://...
WPF
里分三种
Binding
:
Binding
,Priority
Binding
,Multi
Binding
,这三种
Binding
的基类都是
Binding
Base,而
Binding
Base又继承于MarkupExtension
1.
Binding
中
绑定到其他控件 ElementName
Binding
绑定是 模式设置 Mode
2.
source
={bi...
如何
使用
StaticRe
source
s、DynamicRe
source
s 相互绑定属性,尽管您可以找到有关 Re
lative
Source
及其用例的信息,但即使在 Microsoft 文档
中
也没有更多详细信息。在本文
中
,我将公开
WPF
中
Re
lative
Source
s 的用例。
当我们尝试将给定对象的属性绑定到对象本身的另一个属性时,当我们尝试将对象的属性绑定到其相对父对象的另一个属性时,Re
lative
Source
是一种标记扩展,用于特定的绑定情况,在自定义控件开发的情况下以及最后在
使用
一系列绑
不知道是不是有小伙伴遇到过这样的情况。当我们尝试将一个Re
lative
Source
从xaml转到code behind时,原本好好的
binding
表达式居然出现
binding
错误。
我们来做个实验,我们创建了一个UserControl里面有一个TextBlock,其Text属性绑定了类型为Window的父元素的Title。而我们的window里面的title写了"黄腾霄瘦瘦瘦"这个美好的祝愿。(...
Binding
的源是数据的来源,所以,只要一个对象包含数据并且能够通过属性将数据暴露出来,它就能当作
Binding
的源来
使用
。包含数据的对象比比皆是,但必须为
Binding
的
Source
指定合适的对象
Binding
才能正常工作。
1.1 没有
Source
的
Binding
----
使用
DataContext作为数据源
在UI树的每个节点都有DataContext属性。Bin
举一个最简单的例子:在一个StackPanel
中
,有一个TextBlock。
<TextBlock FontSize="18" FontWeight="Bold" Margin="10"
Command="{
Binding
ConfirmRegisterCommand}" CommandParameter="{
Binding
Re
lative
Source
={x:Static Re
lative
Source
.Self},Path=DataContext}"
一.FindAncestor
有时候我们不确定作为数据源的对象叫什么名字,但知道作为绑定源与UI布局有相对的关系...