【avalonia教程】14Binding的其他属性(1)
如果我们不想关心使用Binding的时候,控件找到的DataContext属性是啥,也可以手动给Binding的属性指定DataContext类型:
<TextBlock Text="{Binding PageDesc,DataType={x:Type vm:TextBlockViewModel}}"></TextBlock>
虽然在rider里也会有标红报错,但应该是属于插件的bug,实际是可以跑起来,手动给TextBlock组件设置DataContext属性时,也是可以正常显示的。完整代码如下:
<TextBlock Text="{Binding PageDesc,DataType={x:Type vm:TextBlockViewModel}}"><TextBlock.DataContext><vm:TextBlockViewModel></vm:TextBlockViewModel></TextBlock.DataContext></TextBlock>
这里再说下x:Type,实际上和x:Static一样,也是属于一个扩展标记语法。用法和System.Type
一致,表示后面跟的是一个类的Type类型(即等价于typeof(类名)的返回值)
接下来说一说d:DataContext。之前我们讲过设计时绑定,即设置Design.DataContext。当时我们是放在Window节点中间的,也可以简写放到WIndow标签的属性里面,并指定一个静态变量,代码如下:
public class MainWindowViewModel: ObservableObject
{// 设置一个静态变量public static MainWindowViewModel Instance { get; set; } = new MainWindowViewModel();public string PageDesc { get; set; } = "avalonia ui";
}
<Window xmlns="https://github.com/avaloniaui"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d="http://schemas.microsoft.com/expression/blend/2008"xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"mc:Ignorable="d" d:DesignWidth="300" d:DesignHeight="100"x:Class="avalonia_study.MainWindow"xmlns:vm="using:avalonia_study.ViewModels"x:DataType="vm:MainWindowViewModel"d:DataContext="{x:Static vm:MainWindowViewModel}"Title="avalonia_study"><TextBlock Text="{Binding PageDesc}"></TextBlock>
</Window>
即可在预览窗口看到相关信息
然后Binding中还有四个属性在这里可以提一下:
- FallbackValue: 当绑定无法解析时使用的默认值,常用于设计时预览或错误处理
- TargetNullValue: 当源数据为 null 时显示的替代值
- Priority: 设置绑定值的优先级级别
- UpdateSourceTrigger: 控制 TwoWay 和 OneWayToSource 绑定中源更新的触发时机
关于前两个很好理解,代码如下:
<TextBox Name="DemoBlock" FontSize="32" Text="{Binding #DemoBlock2.Text,FallbackValue=abc, TargetNullValue=efg}"></TextBox>
再说下BindingPriority。BindingPriority
(绑定优先级)是 Avalonia 中用于控制不同来源值优先级的机制。他要解决的问题是:当有多个地方同时对一个属性赋值,谁的优先级最高?
他的工作原理是:
- 当多个来源试图设置同一个属性时,只有最高优先级的值会被应用
- 低优先级的绑定值会被高优先级的值覆盖。例如:样式设置的值会被本地显式设置的值覆盖
从低到高的优先级顺序:
-
BindingPriority.Animation
-
BindingPriority.LocalValue
-
BindingPriority.StyleTrigger
-
BindingPriority.Template
-
BindingPriority.Style
BindingPriority.Inherited
BindingPriority.Unset
实际应用场景:
// 设置绑定优先级
var binding = new Binding("PropertyName")
{Priority = BindingPriority.Animation // 设置为动画优先级
};
这里里面有些什么模板值呀、样式值呀之类的相关你概念,我们还没讲到,大家知道有这么个东西,有用这些概念列举的优先级就行了
再说下UpdateSourceTrigger。
UpdateSourceTrigger 是 Avalonia 数据绑定中的一个重要属性,用于控制双向绑定中源数据更新的时机。也就是当控件属性修改时,何时触发绑定的源属性修改。
主要有以下这么几个
- UpdateSourceTrigger.Default: 使用目标属性的默认更新触发方式
- UpdateSourceTrigger.LostFocus: 当控件失去焦点时更新源数据
- UpdateSourceTrigger.PropertyChanged: 当目标属性值改变时立即更新源数据
- UpdateSourceTrigger.Explicit: 只能通过显式调用更新方法来更新源数据
前面三个拿TextBox试一下即可,视频教程中会做详细演示,这里不做赘述。这里着重说下最后一个:设置为Explicit之后,如何通过手动的方式来更新数据源
var bindingExpressionBase = BindingOperations.GetBindingExpressionBase(DemoBox, TextBox.TextProperty);
bindingExpressionBase?.UpdateSource();