WPF入门(三):简单绑定 - 绑定到页面元素
我们做个简单的页面,页面上有个lable用于显示信息,一个水平滚动条,当拖动滚动条时,在label里显示相应的值。
新建一个wpf应用程序项目。代码如下:
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1" Height="150" Width="623" Background="LemonChiffon">
<Grid Height="108" Width="577">
<Label Name="label1" VerticalAlignment="Top" Content="{Binding ElementName=scrollBar1,Path= Value}" />
<ScrollBar Height="24" Margin="0,47,0,37" Name="scrollBar1" Width="577" Orientation="Horizontal" />
</Grid>
</Window>
代码很简单。在grid里有两个控件Label 和一个ScrollBar.注意 Lable 的Content属性里表达式的写法。
"{Binding ElementName=scrollBar1,Path= Value}"
熟悉asp.net的人很容易看出这句话的意思,他表示:Content的值等于 (元素名称为"scrollBar1" 的 属性Value)的值)。ElementName=scrollBar1,指定了页面的一个元素。我们可以看到 ScrollBar节点的Name = "scrollBar1". Path指定了要绑定属性名称"Value",如果在后置代码里,我们可以使用 scrollBar1.Value获得当前 scrollBar1的滑块位置表示的值。
我们看看如果不用xaml声明的绑定如何写。删除Label元素里的Content属性里的绑定描述。在该页面的后置代码的Load事件里写下面代码
{
Binding binding = new Binding();//新建一个绑定对象
binding.Source = scrollBar1;//指定源
binding.Path = new PropertyPath(ScrollBar.ValueProperty);//指定绑定到的属性
label1.SetBinding(Label.ContentProperty, binding); //要绑定的目标对象自己设定绑定到的属性
}
这段代码基本都能看得懂。虽然不一定了解具体的语法。我们依旧可以知道大概想表达什么的。这里一共有三个对象,一个文本框label1,一个是scrollBar1,一个是Binging对象。Binding对象观察 scrollBar1的属性变化。scrollBar1不知道有Binding这个对象,他首先要有 “值改变事件”,也就是说,Binding对象监听scrollBar1的ValueChanged改变事件。而label1知道有这么一个 “观察scrollBar1变化的中介”,于是他把自己和Binding这个中介关联起来(label1.SetBinding方法)。这样的话,Binding中介会在有消息的时通知lable1,lable1及时更新自己保持(显示)的值(Content)。 这应该就是设计模式里的“观察者模式”。
WCF框架封装了内部的实现,我们可以想象到的写约定有:
1.scrollBar1要有值改变事件,使得 当自己的值改变时 及时通知给 事件的订阅者。
2.lable1要 订阅 Binding 的消息,使得当 Binding有新消息时,及时更新自己的显示。
如果是在winfrom里应编码的话,我们肯定会考虑 订阅scrollBar1.ValueChanged事件,然后在事件里获得scrollBar1.Value,设置这个值到Lable.Text上。这里提供了更简单的写法。
待续....