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="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        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="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        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="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        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标记扩展,将其合并到一个字符串中,如下所示:

<Window x:Class="Test1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Window.Resources>
        <FontFamily x:Key="CustomFont">Calibri</FontFamily>
    </Window.Resources>
    <Grid>
        <TextBlock Text="{Binding Path=Title,RelativeSource={RelativeSource Mode=FindAncestor,AncestorType={x:Type Window}}}">
        </TextBlock>
    </Grid>
</Window>

当创建RelativeSource对象时,FindAncestor模式有4种,表8-3列出了所有4种模式
表8-3 RelativeSourceMode枚举值

self:表达式绑定到同一元素的另一个元素属性上;

FindAncestor:表达式绑定到父级元素。WPF将查找元素树直至发现期望的父元素。为了指定父元素,还必须设置AncestorType属性以指示希望查找的父元素的类型。此外,还可以用AncestorLevel属性略过发现的一定数量的特定元素;

PreviousData:表达式绑定到数据绑定列表中的前一个数据项。在列表项中会使用这种模式

TemplateParent:表达式绑定到应用模板的元素。只有当绑定位于控件模板或数据模板内容时,这种模式才能工作

RelativeSource属性看似多余,并且会使标记变得复杂。毕竟,为什么不使用Source或者ElementName属性直接绑定到希望绑定的源呢?然而,并不总可以使用Source或ElementName属性,这通常是因为源对象和目标对象在不同的标记块中。当创建控件模板和数据模板时会出现这种情况。例如,如果正在构建改变列表项显示方式的数据模板,可能需要访问顶级的ListBox对象以读取属性。

DataContext属性

在某些情况下,会将大量元素绑定到同一个对象。例如,分析下面的一组TextBlock元素,每个TextBlock元素都使用类似的绑定表达式提取与默认图标相关图标字体相关的不同细节,包括行间距,以及第一个字体的样式和粗细(这两个都是简单的正则表达式)。可以为每个TextBlock元素使用Source属性,但这会使标记变得非常长:

<Window x:Class="Test1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">

    <StackPanel>
        <TextBlock Text="{Binding Source={x:Static SystemFonts.IconFontFamily},Path=Source}">
        </TextBlock>
        <TextBlock Text="{Binding Source={x:Static SystemFonts.IconFontFamily},Path=LineSpacing}"></TextBlock>
        <TextBlock Text="{Binding Source={x:Static SystemFonts.IconFontFamily},Path=FamilyTypefaces[0].Style}"></TextBlock>
        <TextBlock Text="{Binding Source={x:Static SystemFonts.IconFontFamily},Path=FamilyTypefaces[0].Weight}"></TextBlock>
    </StackPanel>
</Window>

对于这种情况,使用FrameworkElement.DataContext属性一次性定义绑定源会更清晰,也更灵活。在这个示例中,为包含所有TextBlock元素的StackPanel面板设置DataContext属性是合理的(甚至还可以在更高层次上设置DataContext属性-例如整个窗口-但是为了使意图更清晰,在尽可能小的范围内进行定义效果更好)。

可以使用和是设置Binding.Source属性相同的方法设置元素的DataContext属性。换句话说,可以提供内联对象,从静态属性中提取,或从资源中提取。

当绑定表达式中省略源信息时,WPF会检查元素的DataContext属性。如果属性值为NULL,WPF会继续向上在元素树种查找第一个不为NULL的数据上下文(最初,所有元素的DataContext属性都是NULL)。如果找到了一个数据上下文,就为绑定使用找到的数据上下文。如果没有找到,绑定表达式不会为目标属性应用任何值。
————————————————
版权声明:本文为CSDN博主「大约In冬季」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/wudong121/article/details/52073309

原文地址:https://www.cnblogs.com/Im-Victor/p/11832428.html

时间: 2024-10-29 21:34:30

WPF:元素绑定的相关文章

WPF元素绑定

原文:WPF元素绑定 数据绑定简介:数据绑定是一种关系,该关系告诉WPF从源对象提取一些信息,并用这些信息设置目标对象的属性.目标属性是依赖项属性.源对象可以是任何内容,从另一个WPF元素乃至ADO.NET数据对象(如DataTable)或自行创建出数据对象.绑定用的是Binding类的一个实例,用的名称空间是:System.Windows.Data: 1.绑定表达式. 数据绑定表达式使用的是XAML标记扩展(因此具有花括号),用到的是System.Windows.Data.Bingding类的

WPF 元素绑定

1.什么是数据绑定数据绑定是一种关系,WPF程序从源对象中提取一些信息,并根据这些信息设置目标对象的属性,目标属性作为依赖项属性.源对象可以是任何内容,可以是另一个wpf内容,甚至是自行创建的纯数据对象. 2.简单的单绑定 将一个元素绑定到另一个元素,第一个例子,是将将一个Slider控件和TextBlock控件绑定.ElementName表示源对象的名字,Path表示源元素的属性.需要使用花括号括起来. <Grid> <Slider Name="sliderFontSize&

学习WPF——元素绑定

概念 从源对象提取一些信息,并用这些信息设置目标对象的属性 示例 在给TextBlock控件的FontSize属性赋值时,我们使用了绑定表达式 数据绑定表达式使用XAML的标记扩展(因此具有花括号)(参见:) 这里创建了一个System.Windows.Data.Binding对象,所以绑定表达式以单词binding开头 在本例中只设置了Binding对象的两个属性ElementName和Path属性 ElementName 指定源元素 Path 指定源元素中的属性 Mode OneWay: 当

WPF元素的绑定

一.两个元素的简单绑     WPF元素的绑定,是指将两个控件绑在一起,比如利用滑动条Slider,改变刻度时,相应的标签元素中的字体的大小就会增加. 这种元素的绑定,要知道谁是目标元素,谁是源元素.比如用滑动条的刻度大小去绑定标签元素中的字体的大小.这里面滑动条的刻度就是源元素,标签字体大小就是目标元素. 在标签元素中字体大小的属性中就可以去直接绑定,绑定语句是: FontSize="{Binding ElementName=slider1,Path=Value} 解释:Binding Ele

WPF学习系列之六 (元素绑定)

元素绑定 简单地说,数据绑定是一种关系,该关系告诉WPF从一个源对象提取一些信息,并使用这些信息设置目标对象的属性.目标属性总是依赖属性,并且通常位于WPF元素中. 一.将元素绑定到一起 <Window x:Class="StudyWPF.元素绑定"        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"        xmlns:x="http://schem

【WPF学习】第二十九章 元素绑定——将元素绑定到一起

原文:[WPF学习]第二十九章 元素绑定--将元素绑定到一起 数据banding的最简单情形是,源对象时WPF元素而且源属性是依赖性属性.前面章节解释过,依赖项属性具有内置的更改通知支持.因此,当在源对象中改变依赖项属性的值时,会立即更新目标对象中的绑定属性.这正是我们所需要的行为--而且不必为此构建任何额外的基础结构. 为理解如何将一个元素绑定到另一个元素,下面创建一个简单的示例.该示例窗口包含了两个控件:一个Slider控件和一个具有单行文本的TextBlock控件.如果向右拖动滑动条上的滑

【WPF学习】第三十章 元素绑定——绑定到非元素对象

原文:[WPF学习]第三十章 元素绑定--绑定到非元素对象 前面章节一直都在讨论如何添加链接两个各元素的绑定.但在数据驱动的应用程序中,更常见的情况是创建从不可见对象中提取数据的绑定表达式.唯一的要求是希望显示的信息必须存储在公有属性中.WPF数据绑定数据结构不能获取私有信息或公有字段. 当绑定到非元素对象时,需要放弃Binding.ElementName属性,并使用以下属性中的一个: Source:该属性是指向源对象的引用--换句话说,是提供数据的对象. RelativeSource:这是引用

七,元素绑定

数据绑定是一种关系,该关系告诉WPF从一个源对象提取一些信息,并使用这些信息设置目标对象的属性,目标属性总是依赖项属性,然而,源对象可以是任何内容. 源对象是WPF元素并且源属性是依赖项属性的数据绑定,这是最简单的数据绑定. 绑定表达式 如下XAML示例,数据绑定表达式使用XAML扩展标记,因为绑定表达式以Binding开头,所以它实际上是创建了一个System.Windows.Data.Binding类实例,且设置了它的两个属性:ElementName属性(指示源元素)和Path属性(指示源元

简单元素绑定

前面讲依赖项属性的时候说过,依赖项具有内置的更改通知的支持,依赖项属性的一个特性就是数据绑定本章谈谈数据绑定. 简单第说,数据绑定是一种关系, 该关系告诉WPF从源对象提取一些信息,并用这些信息设置目标对象的属性. 目标属性始终是依赖项属性,通常位于WPF元素中—毕竟,WPF数据绑定的最终目标是在用户界面中显示一些信息.然而,源对象可以是任何内容,从另一个WPF元素乃至ADO.NET数据对象或您自行创建的纯数据对象. 下面先说说元素到元素的绑定: 元素到元素的绑定,源对象是WPF元素而且源属性是