WPF系列教程(二十五):绑定到非元素对象Source属性、RelativeSource属性、DataContext属性

项目源码

数据绑定Binding Source属性

把TextBlock的Text属性绑定到静态的SystemFonts.IconFontFamily:

<TextBlock Text="{Binding Source={x:Static SystemFonts.IconFontFamily},Path=Source}"/>

或者在窗体中定义源:
用元素属性定义了两个资源

<Window.Resources>
    <FontFamily x:Key="CustomFont">
        Calibri
    </FontFamily>
    <FontFamily x:Key="CustomFont2">
        Seria
    </FontFamily>
</Window.Resources>

使用资源时:

<TextBlock Text="{Binding Source={StaticResource CustomFont2},Path=Source}"/>

RelativeSource属性

在一个Window里面,绑定的属性为层级的属性:

<TextBlock>
    <TextBlock.Text>
        <Binding Path="Name">
            <Binding.RelativeSource>
                <RelativeSource Mode="FindAncestor" AncestorType="{x:Type StackPanel}">
                </RelativeSource>
            </Binding.RelativeSource>
        </Binding>
    </TextBlock.Text>
</TextBlock>

这就将TextBlock的Text属性绑定到了它的父级元素StackPannel的Name属性上。
在这里插入图片描述
如果Binding Path=“Title”,AncestorType="{x:Type Window}",则是绑定到了它的父级元素Window的Title属性上了。
如果 Mode=“Self”,则是绑定到了自身:

<Binding Path="Margin">

在这里插入图片描述
也可以用下面这种控件属性的方式设置

<TextBlock Name="textBlock4" Margin="5" Text="{Binding Path=Title,RelativeSource={RelativeSource Mode=FindAncestor,AncestorType={x:Type Window}}}">

AncestorLevel=1用于设置往上寻找父级元素的层数,例如
在这里插入图片描述

<TextBlock Name="textBlock4" Margin="5" Text="{Binding Path=Name,RelativeSource={RelativeSource Mode=FindAncestor,AncestorType={x:Type StackPanel},AncestorLevel=2}}">

就往上寻找父元素,直到找到第二个,就是最外层的,如果设为1,就是内层的。

DataContext属性

将大量的属性绑定到同一个元素。
例如下面三个TextBlock

<TextBlock Name="textBlock5" Margin="5" Text="{Binding Source={x:Static SystemFonts.IconFontFamily},Path=Source}"/>
                <TextBlock Name="textBlock6" Margin="5" Text="{Binding Source={x:Static SystemFonts.IconFontFamily},Path=LineSpacing}"/>
                <TextBlock Name="textBlock7" Margin="5" Text="{Binding Source={x:Static SystemFonts.IconFontFamily},Path=FamilyTypefaces[0].Style}"/>

都绑定到了同一个Source,但是不同Path,代码过于重复,这时候适合使用DataContext属性。
我们在它们的父级元素之下设置DataContext属性即可:

<StackPanel Margin="3" Name="stackPannel1" DataContext="{x:Static SystemFonts.IconFontFamily}">

TextBlock元素不需要设置Source属性了,只需要设置Path属性:

<TextBlock Name="textBlock5" Margin="5" Text="{Binding Path=Source}"/>
<TextBlock Name="textBlock6" Margin="5" Text="{Binding Path=LineSpacing}"/>
<TextBlock Name="textBlock7" Margin="5" Text="{Binding Path=FamilyTypefaces[0].Style}"/>

像这样的绑定属性Binding只有Path而没有Source,控件会一直向父级元素搜索DataContext属性,直到找到最近的作为自己的源,否则,如果找不到,就不会绑定到任何源。
所以像这个例子,DataContext只要设置在TextBlock的某一个上级元素中即可供TextBlock用作源。

Guess you like

Origin blog.csdn.net/qq_43511299/article/details/121619421