添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
我们进行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代码&lt;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布局有相对的关系...