Binding(二)——Binding的路径

一、Binding的路径概述

Binding源的对象也许有很多属性,通过这些属性可以把Binding源的数据暴露给外界。那么,Binding到底需要关注哪些属性呢?这需要由Binding的Path属性决定。

尽管在XAML代码或者Binding类的构造器参数列表中,我们用一个一个字符串表示Path。但Path的实际类型是PropertyPath。下面将用XAML和C#两种方式来描述。

<TextBox x:Name="textBox1" Text="{Binding Path=Value, ElementName=slider1}"/>

等效的C#代码是:

Binding binding = new Binding() { Path = PropertyPath("Value"), Source = this.slider1 };
this.textBox1.SetBinding(TextBox.TextProperty, binding);

或者使用Binding的构造器简写为:

Binding binding = new Binding("Value") { Source = this.slider1 };
this.textBox1.SetBinding(TextBox.TextProperty, binding);

二、多级路径

Binding还支持多级路径。例如,我们想让一个TextBox显示另外一个TextBox的文本长度:

XAML代码:

<TextBox x:Name="textBox1" BorderBrush="Black" Margin="5"/>
    <TextBox x:Name="textBox2" BorderBrush="Black" Margin="5"
         Text="{Binding Path=Text.Length, ElementName=textBox1, Mode=OneWay}"/>
</StackPanel>
等效C#代码:

this.textBox2.SetBinding(TextBox.TextProperty, new Binding("Text.Length") { Source = this.textBox1, Mode = BindingMode.OneWay });

另外,索引器也能作为Path来使用。比如想让一个TextBox显示另一个TextBox文本的第四个字符。

XAML代码:

    <StackPanel>
        <TextBox x:Name="textBox1" BorderBrush="Black" Margin="5"/>
        <TextBox x:Name="textBox2" BorderBrush="Black" Margin="5"
             Text="{Binding Path=Text.[3], ElementName=textBox1, Mode=OneWay}"/>
    </StackPanel>

甚至可以把Text与[3]之间的那个“.”去掉,它一样可以正常工作。运行效果如下:


三、多级斜线

当使用一个集合或者DataView作为Binding源时,如果我们想把它的默认元素当作 Path使用,则需要使用这样的语法:

List<string> stringList = new List<string>() { "Tom", "Tim", "Blog" };
this.textBox1.SetBinding(TextBox.TextProperty, new Binding("/") { Source = stringList });
this.textBox2.SetBinding(TextBox.TextProperty, new Binding("/Length") { Source = stringList, Mode = BindingMode.OneWay });
this.textBox3.SetBinding(TextBox.TextProperty, new Binding("/[2]") { Source = stringList, Mode = BindingMode.OneWay });

四、没有Path的Binding

有时候在代码中看到一些Path是一个".",或者干脆没有Path的Binding。这是一种比较特殊的情况——Binding源本身就是数据且不需要Path来指明。在XAML代码里这个"."

    <StackPanel>
        <StackPanel.Resources>
            <sys:String x:Key="myString">
                菩提本无树,明镜亦非台。
                本来无一物,何处惹尘埃。
            </sys:String>
        </StackPanel.Resources>
        <TextBlock x:Name="textBlock1" TextWrapping="Wrap"
                   Text="{Binding Path=., Source={StaticResource ResourceKey=myString}}"
                   FontSize="16" Margin="5"/>
    </StackPanel>

上面的代码可以简写:

Text="{Binding ., Source={StaticResource ResourceKey=myString}}"


Text="{Binding , Source={StaticResource ResourceKey=myString}}"
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值