当前位置: 首页 > news >正文

【avalonia教程】15Binding的其他属性(2)

接下来将Binding的最后三个属性:

  • ElementName: 通过元素名称引用同一视图中的其他控件作为绑定源
  • Source: 显式指定绑定的数据源对象
  • RelativeSource: 指定相对绑定源,如 RelativeSource.Self 或 RelativeSource.FindAncestor

先说ElementName。我们之前讲过,把一个控件的属性绑定到另一个控件上,可以这么写:

<TextBlock Text="{Binding #DemoBox.Text}"></TextBlock>
<TextBox Name="DemoBox"></TextBox>

通过ElementName属性指定其他控件后,可以省略#DemoBox,代码如下:

<TextBlock Text="{Binding Text, ElementName=DemoBox}"></TextBlock>
<TextBox Name="DemoBox"></TextBox>

然后是Source属性,用来显视指定控件绑定的数据源。之前控件的数据源,默认都是DataContext,现在可以显示指定成其他对象。

<TextBox Name="DemoBox"  Text="{Binding Name, Source={x:Static vm:Student.Instance}}"></TextBox>

最后是RelativeSource。官方的说法是:RelativeSource 是 Avalonia 中一种绑定源指定方式,允许元素相对于自身或其他元素建立绑定关系,而无需显式命名元素。

是不是有点难理解?没关系我们点进去看一下,会发现有以下4中枚举值可选:

  • DataContext
  • TemplatedParent
  • Self
  • FindAncestor

是不是能稍微看出点意思来?其实就是指定数据源,之前我们讲的大部分场景,都是指定的控件找到的DataContext,接下来我们看下指定Self的示例:

<TextBox Name="DemoBox"  Text="{Binding Name, RelativeSource={RelativeSource Self}}"></TextBox>

运行后你会发现,Text和它自身的Name属性做了绑定。

TemplatedParent是用在ControlTemplate的内部,这块我们暂时还理解不了,等讲解了ControlTemplate后再来讲解。

最后我们再来看下FindAncestor。官方的说法是:FindAncestor 是 RelativeSource 的一种模式,用于在视觉树中向上查找指定类型的祖先元素作为绑定源。

很明显,这个是用来将指定类型的父组件作为绑定源。使用代码如下:

<TextBox Name="DemoBox" Text="{Binding  Tag, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=StackPanel,AncestorLevel=2}}"/>

AncestorType指的父组件的类型,AncestorLevel指定第几层的父组件,默认为1。这里定义为2,按理说就相当于我们之前写的$parent[1],但实际情况不是这样,同时我们看源码自己写的测试用例,也应该是这么用的。合理怀疑这是个bug。

相信大家这里看到了另一种在axaml文件中定义对象的方法:

RelativeSource={RelativeSource FindAncestor, AncestorType=StackPanel,AncestorLevel=2}

为什么这么写,就可以定义一个RelativeSource的对象了呢?点进去代码,发现里面有一段逻辑:

  public RelativeSource ProvideValue(IServiceProvider serviceProvider){return new RelativeSource(){Mode = this.Mode,AncestorType = this.AncestorType,AncestorLevel = this.AncestorLevel,Tree = this.Tree};}

依葫芦画瓢,我们仿着写一下:

public class MainWindowViewModel
{public MainWindowViewModel ProvideValue(IServiceProvider serviceProvider){return new MainWindowViewModel(){PageDesc = this.PageDesc};}public string? PageDesc { get; set; }
}
<TextBox Name="DemoBox1" DataContext="{vm:MainWindowViewModel PageDesc=test2233}" Text="{Binding #DemoBox1.DataContext.PageDesc}"/>

会发现可以实现一样的效果。

有些同学可能也会问:为什么第一个Mode属性不用写名字呢?因为RelativeSource有一个带Mode参数的构造函数

http://www.dtcms.com/a/516897.html

相关文章:

  • 企业网站作用平湖手机网站建设
  • 算法leetcode|96. 不同的二叉搜索树(多语言实现)
  • 快速上手ip link命令:查看你的网络接口信息
  • 视频汇聚平台EasyCVR级联播放偶发失败排查:TCP主动模式下的3秒超时响应差
  • 苏州马可波罗网站建设wordpress单页主题制作视频教程
  • html手机网站怎么做清新织梦淘宝客模板淘客网站程序源码
  • 20.2 图像识别技术革命:多模态模型准确率突破87.6%,传统方案效率飙升32%!
  • 深圳网站建设加盟网站 方案
  • ★ Linux ★ 线程概念与控制
  • 设计师接私单做网站为什么打不开建设银行网站
  • 前端-登录认证技术
  • AI开发结构化输出
  • Leetcode 32
  • eclipse tomcat运行普通web项目发现mysql-connector-java-8.0.30.jar包无法自动部署 的解决办法
  • 【经典算法,限时免费】LeetCode698、划分K个相等的子集(回溯解法)
  • 做网站为职业生存不下去nginx wordpress rewrite
  • RK3568 MIPI 摄像头驱动的 V4L2 多平面视频格式解析
  • 英伟达RTX 6000 Ada 和L40S 对比,哪个更适合做深度学习?
  • 网站开发维护费用学校网站建设工作
  • 华为专利申请的核心指导思想
  • 做配资网站多少钱我想花钱做网站
  • 自适应单行tooltip省略号
  • 网站难做jquery+html5 网站后台管理页面模板
  • 做seo网站 公司三丰云服务器
  • 关于监控与部署
  • 3.虚拟化技术(一)
  • CentOS x86_64架构下载aarch64(arm64)包
  • VMware 中遇到“没有检测到磁盘”的问题
  • 做外贸如何分析客户网站wordpress怎么选主题
  • 操作系统—内存管理(1)