先举个小例子:
- 现在我有一个Slider和一个Textbox。我希望在滑动Slider的时候,Textbox实时显示Slider的Value属性的值。该怎么办呢?
XAML代码如下:
<StackPanel>
<TextBox x:Name="t1" Text="{Binding Path=Value, ElementName=s1,,Mode=TwoWay}"/>
<Slider x:Name="s1" Minimum="0" Maximum="100" />
</StackPanel>
与上述等价的C#代码为:
t1.SetBinding(TextBox.TextProperty, new Binding("Value") { ElementName = "s1" });
还可以这样写:
Binding binding = new Binding();
binding.Path = new PropertyPath("Value");
binding.Source = s1;
t1.SetBinding(TextBox.TextProperty, binding);
详解
Path
- Binding是什么呢?假使窗体上有三个控件Textbox,Textbox和Slider。它们的Name属性分别为A,B,C。可以做出这样的设想:将控件想象成岛屿,控件与控件存在着河流。现在,我希望在A岛和B岛之间架设一座桥梁。 这样,两岸的数据便可以实现交流。这座“桥梁”就是Binding。
- 那么,Path又在其中起什么作用呢?我们继续想象:如果要建设一个连接两个岛屿的桥,总是要事先规定好起点和终点吧。那么又是什么能作为“桥梁”起点和终点呢?答案就是控件的属性。比如Textbox控件的Text属性就可以作为起点。当然,Text下的Length也是属性,它可以作为终点进行设定。据此,可以有如下代码:
<StackPanel>
<TextBox x:Name="t1" />
<TextBox x:Name="t2" Text="{Binding Path=Text.Length,ElementName=t1,Mode=OneWay}"/>
</StackPanel>
上述代码所要实现的效果就是:当我在t1中输入字符,t2就能实时显示t1中字符的长度。
ElementName
还是以岛屿和桥梁举例。ElementName的作用就是指出你欲将桥架向哪座岛屿。
Mode
此参数用于设定桥梁上的数据流向。比如Slider的例子就是一个双向流通的模式。即:我滑动Slider,Textbox会显示Slider此时的Value属性值。反过来,我在Textbox中输入值,Slider也会自动跳到相应位置。
又比如上述Text.Length的例子,这里显然双向流通模式就不适用了,故将其设为单线流通模式。即:数据只会从t1的Text属性流出,t2也只会接受数据而不会发送数据。