Bingding 的属性
- Path
- Source
Path
Binding 的默认第一个参数即 Path 表示绑定的属性路径, 默认是 DataContext
// 这两种情况下都是绑定到 DataContext
<TextBlock Text="{Binding}" />
<TextBlock Text="{Binding . }" />
绑定源
Source
Source 表示绑定的源, 可以根据此属性定位到绑定的资源
- 绑定到资源字典中的资源,通过Key绑定 : Source=“{StaticResource key}”
- 项目中的动态变量,枚举类型等等: Source=“{x:static varPath}”
- CollectionViewSource
- ObjectDataProvider
ElementName
绑定到当前页面上其他控件
<TextBox Name="txt" />
<TextBlock Text="{Binding ElementName=txt, Path=Text}" />
需要注意的是,这种囊定需要跟 WPF 的可视化树和明敏范围相关, 如果当前元素和绑定的元素不在同一个棵可视化树,则绑定会失败,如一下代码:
<TextBox Name="txt" />
<TextBlock Text="{Binding ElementName=txt, Path=Text}" >
<TextBlock.ToolTip>
<!-- 这个TextBlock 将会无法绑定, 原因是 ToolTip 已经脱离了原来的可视化树 -->
<TextBlock Text="{Binding ElementName=txt, Path=Text}" />
</TextBlock.ToolTip>
</TextBlock>
解决的办法是使用 x:Reference
<TextBox Name="txt" />
<TextBlock Text="{Binding ElementName=txt, Path=Text}" >
<TextBlock.ToolTip>
<TextBlock Text="{Binding Source="{x Reference txt}, Path=Text}" />
</TextBlock.ToolTip>
</TextBlock>
RelativeSource
相对源, 即从当前元素起始, 获取其上下文范围内的其他元素, 例如往父级找元素,或元素的其他属性
相比于 ElementName 此方法更加灵活, 功能更强大
// 找到父级最邻近的 Window 元素的 Top 属性绑定
// Mode=FindAncestor 为默认方式,可省略
// AncestorLevel=1 为默认,一般省略, 如需要指定找到父级第几个命中元素,则需要显示指定
<TextBlock Text="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorLevel=1 AncestorType=Window}, Tath=Top}" />
// 一个绑定到同级元素的奇技淫巧
<StackPanel>
<TextBox Text="ddd" />
// 想通过 FindAncestor 方式找到父级, 然后指定复制的元素和路径
<TextBlock Text="{Binding RelaticeSource={RelativeSource AcestorType=StackPanel, Path=Children[0].Text}" />
</StackPanel>
绑定模式
- OneWay: 只会从后台更新到前端,UI上的更改不会同步回后台,且性能较好
- TwoWay: 最常用的双向绑定,也是默认的行为
- OneWayToSource: 与 OneWay 方向相反
- OneTime: 一次性的 OneWay
<TextBlock Text="{Binding xxx, Model=OneWay }"
参考:https://learn.microsoft.com/zh-cn/dotnet/desktop/wpf/data/?view=netdesktop-8.0