当前位置:首页 > Windows程序 > 正文

WPF:元素绑定

到目前为止都在讨论如何链接两个元素的绑定。但在数据驱动的应用程序中,更常见的情况是创建从不可见的对象中提取数据绑定表达式。唯一的要求是希望显示的信息必须存储在公有的属性中。WPF数据绑定基础结构不能获取私有信息或共有字段。

当绑定到非元素对象时,需要放弃Binding.ElementName属性,并使用一下属性中的一个:

Source:该属性是指向源对象的引用---换句话说,是提供数据的对象。

RelativeSource:这是引用,使用RelativeSource对象指向源对象。有了这个附加层,可以在当前元素(包含绑定表达式的元素)的基础之上构建引用。这个似乎无所谓地增加了复杂程度,但实际上,ReltiveSource属性是一种特殊工具,当编写控件模板以及数据模版时是很方便的。

DataContext:如果没有使用ReltiveSource和Source属性指定源,WPF就从当前元素开始在元素树上向上查找。检查每个元素的DataContext属性,并使用第一个非空的DataContect属性。当我要将同一个对象的多个属性绑定到不同元素的时候,DataContext属性是非常有用的,因为可以在更高层次的容器对象上(而不是直接在目标元素上)设置DataContext属性。

接下来详细介绍这三个属性的更多细节。

Source属性:

Source属性非常简单。唯一的问题是为了进行绑定,需要具有数据对象。在稍后将会看到,可以用几种方法获取对象。可从资源中提取数据对象,可以通过编写代码生成数据对象,也可以在数据提供程序的帮助下获取数据对象。

最简单的选择是将Source属性指向一些已经准备好了静态对象。例如:可以在代码中创建一个静态对象并使用该对象。或者,可以使用来自.NET类库的组件,如下所示:

<Window x:Class="Test1.MainWindow" xmlns="" xmlns:x="" Title="MainWindow" Height="350" Width="525"> <Grid> <TextBlock Text="{Binding Source={x:Static SystemFonts.IconFontFamily},Path=Source}"></TextBlock> </Grid> </Window>

这个绑定表达式获取由静态属性SystemFonts.IconFamily提供的FontFamily对象(注意,为了设置Binding.Source属性,需要借助静态标记扩展)。然后将Binding,Path属性设置为FontFamily.Source属性,该属性给出了字体家族的名称。结果是一行文本。

另一种选择是绑定到先前作为资源创建的对象。例如,下面的标记创建的指向Calibri字体的FontFamily对象:

<Window x:Class="Test1.MainWindow" xmlns="" xmlns:x="" Title="MainWindow" Height="350" Width="525"> <Window.Resources> <FontFamily x:Key="CustomFont">Calibri</FontFamily> </Window.Resources> <Grid> <TextBlock Text="{Binding Source={StaticResource CustomFont},Path=Source}"></TextBlock> </Grid> </Window>

RelativeSource属性:

通过RelativeSource属性可以根据相对目标对象的关系指向源对象。例如:可以使用RelativeSource属性将元素绑定到自身或其父元素(不知道在元素树中从当前元素到绑定的父元素之间有多少代)。

为设置Binding.RelativeSource属性,需要使用RelativeSource对象。这会使得语法变得更加复杂,因为除了需要创建Binding对象外,还需要在其中创建嵌套的RelativeSource对象。一种选择是使用属性设置语法而不是Binding标记扩展。例如,下面的代码为TextBlock.Text属性创建了一个Binding对象,这个Binding对象使用查找父窗口并显示窗口标题的RelativeSource对象:

<Window x:Class="Test1.MainWindow" xmlns="" xmlns:x="" Title="MainWindow" Height="350" Width="525"> <Window.Resources> <FontFamily x:Key="CustomFont">Calibri</FontFamily> </Window.Resources> <Grid> <TextBlock> <TextBlock.Text> <Binding Path="Title"> <Binding.RelativeSource> <RelativeSource Mode="FindAncestor" AncestorType="{x:Type Window}"/> </Binding.RelativeSource> </Binding> </TextBlock.Text> </TextBlock> </Grid> </Window>

RelativeSource对象使用FindAncestor模式,该模式告知查找元素树知道发现AncestorType属性定义的元素类型。

编写绑定更常用的方法是使用Binding和RelativeSource标记扩展,将其合并到一个字符串中,如下所示:

温馨提示: 本文由杰米博客推荐,转载请保留链接: https://www.jmwww.net/file/10206.html