首页 > 其他分享 >Binding 中 Elementname,Source,RelativeSource 三种绑定的方式

Binding 中 Elementname,Source,RelativeSource 三种绑定的方式

时间:2023-12-21 16:25:27浏览次数:39  
标签:Elementname RelativeSource binding 绑定 Binding Source 属性

在WPF应用的开发过程中Binding是一个非常重要的部分。

在实际开发过程中Binding的不同种写法达到的效果相同但事实是存在很大区别的。

这里将实际中碰到过的问题做下汇总记录和理解。

1. source = {binding} 和source = {binding RelativeSource={RelativeSource self},Path=DataContext}效果相同

理解:{binding} 不设定明确的绑定的source,这样binding就去从本控件类为开始根据可视树的层次结构自下而上查找不为空的Datacontext属性的值。

         {binding RelativeSource={RelativeSource self},Path=DataContext}中RelativeSource self的含义为绑定的source为控件自身,这样binding 就绑定了自身控件的Datacontext。

效果:

     <StackPanel DataContext="abc">
        <Label Content="{Binding}"></Label>
        <Label Content="{Binding RelativeSource={RelativeSource Self},Path=DataContext}"></Label>
    </StackPanel>

      

    <StackPanel DataContext="abc">
        <Label Content="{Binding}"></Label>
        <Label DataContext="def" Content="{Binding RelativeSource={RelativeSource Self},Path=DataContext}"></Label>
    </StackPanel>

       

2.在Template的Trigger中改变Template中某个样式控件的属性

复制代码
    <Style TargetType="{x:Type Button}">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type Button}">
                    <Border>
                        <Label x:Name="PART_Label" Content="{TemplateBinding ContentA}" />
                    </Border>
                    <ControlTemplate.Triggers>
                        <Trigger Property="IsChecked" Value="True">
                        注:    <Setter TargetName="PART_Label" Property="Content" Value="{Binding Path=ContentB, RelativeSource={RelativeSource TemplatedParent}}" />
                        </Trigger>
                    </ControlTemplate.Triggers>
                </ControlTemplate>                
            </Setter.Value>
        </Setter>
    </Style>
复制代码

当然把注:的这句改成<Setter TargetName="PART_Label" Property="Content" Value="{Binding Path=ContentB, RelativeSource={RelativeSource AncestorType={x:Type Button}}}">效果一样。

当一个Binding有明确的数据来源时可以通过为Source或ElementName赋值的办法让Binding与之关联,有的时候由于不能确定Source的对象叫什么名字,但知道它与作为Binding目标的对象在UI布局上有相对关系,比如控件自己关联自己的某个数据、关联自己某级容器的数据,就要使用Binding的RelativeSource属性。RelativeSource属性的数据类型为RelativeSource类,通过这个类的几个静态或非静态属性可以控制它搜索相对数据源的方式。

我们来看一看Elementname,Source,RelativeSource 三种绑定的方式

     1.ElementName顾名思义就是根据Ui元素的Name来进行绑定:

     例子:

复制代码
  <Window x:Name="MainWindow">
         <Grid>
               <Button Background=”{Binding ElementName=MainWindow, Path=Background}”/>
         </Grid>
  </Window>
效果等同于
<Window>
   <Grid>
      <Button Background=”{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type Window},Path=Background}”/>
   </Grid>
</Window>
复制代码

     区别:

         ElementName属性用于引用一个UI对象的名称,其的作用域在同一XAML文件内,不能引用另一XAML文件的某个Ui元素名。

     2.Source属性用于指定对象绑定路径的引用。 其特点是:Source属性通常用于绑定设置的对象时,是已知的。

 <Window x:Name="MainWindow">
         <Grid>
               <Button Background=”{Binding Source={StaticResource ButtonStyle}}”/>
         </Grid>
</Window>

     3.RelativeSource

     在不确定绑定的Source时,但知道与绑定对象两者相对关系时就需要使用RelativeSource,这也是RelativeSource 与ElementName和Source的最大区别。

     RelativeSource 的三种典型用法:

     /1.UI元素的一个属性绑定在自身的另一个属性上

<Label Background = {Binding Path=Forgroud, RelativeSource={RelativeSource Self}} />

     /2.UI元素的一个属性绑定在某个父元素的属性上

<Grid>
   <Label Background = {Binding Path=Background, RelativeSource={RelativeSource AncestorType={x:Type Grid}}}/>
</Grid>

     /3.Template中的元素的属性绑定在Template使用者元素的属性上

  {Binding Path=PathToProperty, RelativeSource={RelativeSource TemplatedParent}}

     例子: 

<Style TargetType="{x:Type local:NumericUpDown}">
<Setter Property="HorizontalAlignment" Value="Center"/>
<Setter Property="VerticalAlignment" Value="Center"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type local:NumericUpDown}">
<Grid Margin="3">
<Grid.RowDefinitions>
<RowDefinition/>
<RowDefinition/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<Border BorderThickness="1" BorderBrush="Gray"
Margin="2" Grid.RowSpan="2"
VerticalAlignment="Center" HorizontalAlignment="Stretch">

<TextBlock Text="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Value}"
Width="60" TextAlignment="Right" Padding="5"/>
</Border>
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>

复制代码
<Style TargetType="{x:Type local:NumericUpDown}">
  <Setter Property="HorizontalAlignment" Value="Center"/>
  <Setter Property="VerticalAlignment" Value="Center"/>
  <Setter Property="Template">
    <Setter.Value>
      <ControlTemplate TargetType="{x:Type local:NumericUpDown}">
        <Grid Margin="3">
          <Grid.RowDefinitions>
            <RowDefinition/>
            <RowDefinition/>
          </Grid.RowDefinitions>
          <Grid.ColumnDefinitions>
            <ColumnDefinition/>
            <ColumnDefinition/>
          </Grid.ColumnDefinitions>
          <Border BorderThickness="1" BorderBrush="Gray" 
                  Margin="2" Grid.RowSpan="2" 
                  VerticalAlignment="Center" HorizontalAlignment="Stretch">

            <TextBlock Text="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Value}" 
                       Width="60" TextAlignment="Right" Padding="5"/>
          </Border>
        </Grid>
      </ControlTemplate>
    </Setter.Value>
  </Setter>
</Style>
复制代码

利用TemplateBinding 绑定模板与原对象之间的属性

     {TemplateBinding Path=PathToProperty}

      例子:

 <ControlTemplate TargetType="{x:Type Button}"  x:Key="buttonTemp">                         
       <Border BorderThickness="3" Background="{TemplateBinding Foreground}">                   
           <TextBlock Foreground="{TemplateBinding Background}"/>                    
        </Border>                       
 </ControlTemplate> 
 

标签:Elementname,RelativeSource,binding,绑定,Binding,Source,属性
From: https://www.cnblogs.com/webenh/p/17919327.html

相关文章

  • uniffi-rs rust 多语言bindings 生成工具
    uniffi-rs是基于webidl描述定义,然后生成不同语言bindings的工具,此工具是在学习pyo3的maturin工具看到的,整理记录下参考玩法 目前支持的语言官方支持的包含了Kotlin,Swift,Python,Ruby当然还有不少社区的实现,比如支持C#以及golang说明以上就是一个简单的记录,后边尝试......
  • cbindgen rust 代码生成c binding 的工具
    rust与c以及c与rust的互调用还是比较常见的需求,很多时候自己写可能比较费事,但是使用一些工具就比较方便了cbindgen是一个对于rust代码生成cbinding的工具参考使用基于cbindgen将rust的代码生成对应的c头文件,之后基于cmake构建项目项目结构 ├──......
  • wpf data binding
     publicpartialclassWindow2:Window{publicPersonvmPerosn=newPerson();publicWindow2(){InitializeComponent();vmPerosn.Name="JackZhao";vmPerosn.Phone=&qu......
  • WPF 绑定binding都有哪些事件
    在WPF中,源属性(SourceProperty)指的是提供数据的属性,通常是数据模型或者其他控件的属性,而目标属性(TargetProperty)则是数据绑定的目标,通常是绑定到控件的属性,例如TextBlock的Text属性。数据绑定将源属性的值自动更新到目标属性中。 主要包含以下几个事件:1. UpdateSourceTrigg......
  • Binding failed for port xxxxxx
    nova-compute.log2040-13-3220:02:33.4517ERRORnova.compute.manager[Nonereq-b844f0bb-e907-4c17-807f-3f418be83679207fdd48eb414c78bdbc9b6a55362dc59252305d9c2f46bc882c15d412d25911--defaultdefault]Instancefailednetworksetupafter1attempt(s):n......
  • Tekton Trigger TriggerBindings 基础
    TriggerBindings概述TriggerBinding的功能主要用于将Event中特定属性的值传递给TriggerTemplate上的参数从而完成其resourcetemplates中模板资源的实例化。注意:Trigger使用参数名称将TriggerBinding参数与TriggerTemplate参数匹配。为了传递信息,绑定中使用的参数名称必须与......
  • mybatisPlus报orq.apache ibatisbinding.BindingException: Invalid bound statement
     出现这种问题依次检查下列内容1.检查xml映射文件中标签绑定包名地址是否正确(即namespace的值)2.检查xxxMapper接口中的方法,对应xml映射文件中是否有3.检查标签中的resultType是否与xxxMapper接口中的方法返回值类型一致,若一个是对象一个是集合,那也会报错~4.检查yml配置文件中......
  • WPF数据绑定对象Binding中的辅助属性
    数据绑定方向——ModelnamespaceSystem.Windows.Data{publicenumBindingMode{TwoWay=0,OneWay=1,OneTime=2,OneWayToSource=3,Default=4}}TwoWay=0,绑定的双方,值可以相互传递OneWay=1,绑定......
  • WPF --- 如何以Binding方式隐藏DataGrid列
    引言如题,如何以Binding的方式动态隐藏DataGrid列?预想方案像这样:先在ViewModel创建数据源People和控制列隐藏的IsVisibility,这里直接以MainWindow为DataContextpublicpartialclassMainWindow:Window,INotifyPropertyChanged{publicMainWindow(){......
  • 关于使用dataBinding找不到控件ID的问题
    前提提要:知道真相的我真的难受在应用级别gradle配置中开启了dataBinding在布局文件中使用了layoutactivity_main_dessert.xml是我的xml文件名使用databing的过程如下结果:大面积的控件ID找不到,真的难受解决方式:就是这里,名字太相似了,完全没注意......