一、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}}"