.NEt专家博客!

【李会军】一步一步学Silverlight 2系列(11):数据绑定

上一篇 / 下一篇  2008-04-11 19:36:22

概念

Silverlight 2 Beta 1版本发布了,无论从Runtime还是Tools都给我们带来了很多的惊喜,如支持框架语言Visual Basic, Visual C#, IronRuby, Ironpython,对JSON、Web Service、WCF以及Sockets的支持等一系列新的特性。《一步一步学Silverlight 2系列》文章带您快速进入Silverlight 2开发。

本文为系列文章第十一篇,主要介绍Silverlight 2中的数据绑定。

数据绑定模式

在Silverlight 2中,支持三种模式的数据绑定。

1.OneTime:一次绑定,在绑定创建时使用源数据更新目标,适用于只显示数据而不进行数据的更新。

2.OneWay:单向绑定,在绑定创建时或者源数据发生变化时更新到目标,适用于显示变化的数据。

3.TwoWay:双向绑定,在任何时候都可以同时更新源数据和目标。

Jesse Liberty举 的例子非常的形象,使用Silverlight开发一个在线书店,显示书籍的书名、作者等信息,使用OneTime模式,这些数据一般不会发生变化的;显 示价格信息时使用OneWay模式,因为管理员可能会在一天内调整价格;显示书籍的剩余数量时用TwoWay模式,数量随着用户的订购会随时发生变化,即 目标和源数据都要进行更新。

简单数据绑定

在本示例中我们将做一个简单的数据绑定,用来显示用户信息,XAML如下:

<Gridx:Name="LayoutRoot"Background="#46461F">
e;`Obeo2f#x0<
Grid.RowDefinitions>ITPUB个人空间3ylG&|l
<
RowDefinitionHeight="160"></RowDefinition>ITPUB个人空间n8q?6f1g v
<
RowDefinitionHeight="40"></RowDefinition>ITPUB个人空间O5E0^T f-B
<
RowDefinitionHeight="40"></RowDefinition>
+NT5k!E@pX'B0</
Grid.RowDefinitions>
T t:{,K-N;Q-Z0<
Grid.ColumnDefinitions>ITPUB个人空间/jF J-A)RxM&N([.YM
<
ColumnDefinitionWidth="150"></ColumnDefinition>ITPUB个人空间1ezl Rmh+b
<
ColumnDefinitionWidth="*"></ColumnDefinition>
PSQ+raB5]0</
Grid.ColumnDefinitions>ITPUB个人空间+q;sN C"G*V0Z
<
ImageSource="terrylee.jpg"Width="78"Height="100"ITPUB个人空间X+|1{"Uy7U
HorizontalAlignment="Left"Grid.Row="0"Grid.Column="1"/>
)d\,]ib)F$T f,P9?0<
TextBlockForeground="White"FontSize="18"Text="姓名:"ITPUB个人空间T,c#y%k!v%^ G
Grid.Row="1"Grid.Column="0"HorizontalAlignment="Right"/>
[e!XE.A R9`-B T0<
TextBlockx:Name="lblName"Foreground="White"FontSize="18"
\d*V$Am0
Grid.Row="1"Grid.Column="1"HorizontalAlignment="Left"/>ITPUB个人空间1Bb(E7D f2B9qH!?
<
TextBlockForeground="White"FontSize="18"Text="位置:"
M;r6[ s`&GFff-X{/U0
Grid.Row="2"Grid.Column="0"HorizontalAlignment="Right"/>ITPUB个人空间G%V*Yy6D}2b;T2tE
<
TextBlockx:Name="lblAddress"Foreground="White"FontSize="18"
,dD1c%XcR;V7x0
Grid.Row="2"Grid.Column="1"HorizontalAlignment="Left"/>ITPUB个人空间0M E(n5Y!\tD
</
Grid>

添加一个简单User类,它具有Name和Address两个属性:

public classUserITPUB个人空间@.B ? ?3YXc1k
{
1[4J tlx0in.eNQ0public stringName {get;set; }ITPUB个人空间;j)r H2N)`6UR3W#]

wHd!I3pv2T}0public stringAddress {get;set; }ITPUB个人空间 U U oA%m$}&G/qy
}

使用绑定句法{Binding Property}进行数据绑定,注意下面的两个TextBlock控件Text属性:

<Gridx:Name="LayoutRoot"Background="#46461F">
GF#T#r z4g2C A @0<
Grid.RowDefinitions>ITPUB个人空间 L;?/t(L+v/o {
<
RowDefinitionHeight="160"></RowDefinition>ITPUB个人空间7c^1Df!A*b
<
RowDefinitionHeight="40"></RowDefinition>ITPUB个人空间lR E`K:[o3|^
<
RowDefinitionHeight="40"></RowDefinition>
2J&['t&B D(?sS0</
Grid.RowDefinitions>ITPUB个人空间D9W;HCP/E
<
Grid.ColumnDefinitions>ITPUB个人空间9[)ajl%i5L&Nb F7u.f
<
ColumnDefinitionWidth="150"></ColumnDefinition>
PIeh!F#T2m0<
ColumnDefinitionWidth="*"></ColumnDefinition>
(dCTRsj"Wp0</
Grid.ColumnDefinitions>
3Fne.k [BH/A0<
ImageSource="terrylee.jpg"Width="78"Height="100"ITPUB个人空间EoaBh-tv8a
HorizontalAlignment="Left"Grid.Row="0"Grid.Column="1"/>ITPUB个人空间,Jfu ul
<
TextBlockForeground="White"FontSize="18"Text="姓名:"
+eMfV"c.@$LkSO0
Grid.Row="1"Grid.Column="0"HorizontalAlignment="Right"/>
/e0IfRK|X f0<
TextBlockx:Name="lblName"Foreground="White"FontSize="18"ITPUB个人空间9v]{*N&B1srd
Grid.Row="1"Grid.Column="1"HorizontalAlignment="Left"ITPUB个人空间|1L&x!luM;D
Text="{BindingName}"/>
I2F lf-h&@f-@0<
TextBlockForeground="White"FontSize="18"Text="位置:"
d(n:xotY0
Grid.Row="2"Grid.Column="0"HorizontalAlignment="Right"/>
Li0Ms ox0<
TextBlockx:Name="lblAddress"Foreground="White"FontSize="18"ITPUB个人空间$W4A-}mFAd)N3R
Grid.Row="2"Grid.Column="1"HorizontalAlignment="Left"ITPUB个人空间9G/`W(C CNv
Text="{BindingAddress}"/>ITPUB个人空间 ?X N+B8[O i
</
Grid>

指定数据源,注意这里是创建一个User的实例并赋值后,把user实例绑定到了TextBlock的DataContext上,而不是向之前我们所做的示例中那样,直接指定Text属性:

private voidUserControl_Loaded(objectsender,RoutedEventArgse)ITPUB个人空间*S?k Hx
{ITPUB个人空间#hCn!u6K p/T9vY
Useruser =newUser();
c pm#H;y(`$Po0user.Name ="TerryLee";
AYz"K'q9XeG0user.Address ="中国 天津";ITPUB个人空间Xyby.a8sg

n%M"GY [ x8oDG$i0lblName.DataContext = user;ITPUB个人空间%{6|T2k)TYK.i/V@
lblAddress.DataContext = user;ITPUB个人空间4S}8U/wi9b&EHi T:v
}

运行示例后,可以看到:
.pcLZ^%QcU0
5m!i`6X1fW$w6r^0

上面这种数据绑定模式,只是显示数据而不对数据做任何修改,默认的绑定模式是一次绑定OneTime。

单向绑定示例

如果需要在数据源发生变化时能够通知UI进行相应的更新,即使用单向绑定OneWay或者双向绑定TwoWay,则业务实体需要实现接口 INotifyPropertyChanged。在本示例中,我们加上一个更新按钮,当单击按钮时更新user实例的属性值,会看到界面上的数据也会发生 变化。

修改一下User类,使其实现INotifyPropertyChanged接口。

public classUser:INotifyPropertyChanged
%bie-s}k7oy0
{ITPUB个人空间!r T~7Gx]!z
public eventPropertyChangedEventHandlerPropertyChanged;
K[/H+aZ&f:P r\0ITPUB个人空间AF hSB\s
private string_name;ITPUB个人空间7g1\-ZPfN?
public stringName
!hOU1w_2G1g0{
%d x mW%u,s7@0get{return_name; }
vZ8iB'd0setITPUB个人空间3s:zdI4`3]
{
,Z!gC:P\`"nXm0_name =value;ITPUB个人空间+LX4`J6k b6x
if(PropertyChanged !=null)ITPUB个人空间?6fF2F Qo4P%Uk9y
{ITPUB个人空间F;pVvl R\
PropertyChanged(this,newPropertyChangedEventArgs("Name"));ITPUB个人空间R'`NK;u3o
}ITPUB个人空间7mYNcE|%?4G__
}ITPUB个人空间_JMGgF
}ITPUB个人空间{|?_)~vz-r u

U8UTq R6J0private string_address;
:KX6vf(rQ'Iy:k0public stringAddress
6P8k,}Y`-W:N~SG0{ITPUB个人空间'VU3e#vD e~N Yj1v-I
get{return_address; }
Yw8W6I6k#~2Y0set
m6o(~%c"\;S0
{ITPUB个人空间+vZ*?%x7F&]d-BL
_address =value;ITPUB个人空间"`},RQs
if(PropertyChanged !=null)ITPUB个人空间|2tq9P(ta_ g7Ov
{ITPUB个人空间?6yFZB4]
PropertyChanged(this,newPropertyChangedEventArgs("Address"));
t wF/d2[0}ITPUB个人空间*{(LN2jiX
}
` nIJrg%d2E_?0}ITPUB个人空间4gSM.X9G8}
}

修改数据绑定模式,使用单向绑定OneWay模式,如{Binding Address, Mode=OneWay}

<Gridx:Name="LayoutRoot"Background="#46461F">
B${rg/U0<
Grid.RowDefinitions>ITPUB个人空间;X4i{%czl:Y0k"P
<
RowDefinitionHeight="160"></RowDefinition>
1L+S+]TU4q/F3{0<
RowDefinitionHeight="40"></RowDefinition>
c^R W!emz%p%V0<
RowDefinitionHeight="40"></RowDefinition>ITPUB个人空间NyCE \
</
Grid.RowDefinitions>ITPUB个人空间)O {)g _)?[h,~L
<
Grid.ColumnDefinitions>ITPUB个人空间2L ]R1f |bHeu6] y
<
ColumnDefinitionWidth="150"></ColumnDefinition>
#a)Cg ] M0<
ColumnDefinitionWidth="*"></ColumnDefinition>
D^)qsQt0</
Grid.ColumnDefinitions>
s QE;Ugl.C0<
ImageSource="terrylee.jpg"Width="78"Height="100"
c5d |I4bVMPCU0
HorizontalAlignment="Left"Grid.Row="0"Grid.Column="1"/>ITPUB个人空间3G U*am0Y{o
<
Buttonx:Name="btnUpdate"Width="100"Height="40"
BvR/PVpSL0
Content="Update"Click="btnUpdate_Click"/>
)ZG L!L7]dg{#f0<
TextBlockForeground="White"FontSize="18"Text="姓名:"
P(wgMz T ]8A]0
Grid.Row="1"Grid.Column="0"HorizontalAlignment="Right"/>ITPUB个人空间T.J^u S_ d
<
TextBlockx:Name="lblName"Foreground="White"FontSize="18"ITPUB个人空间1@'Sf'd(E:p T#z(V_
Grid.Row="1"Grid.Column="1"HorizontalAlignment="Left"ITPUB个人空间p9C8NGf JD.Y.X1o
Text="{BindingName,Mode=OneWay}"/>ITPUB个人空间3n3J5jmu$Vs0_Qf
<
TextBlockForeground="White"FontSize="18"Text="位置:"
rk_] v.E}0
Grid.Row="2"Grid.Column="0"HorizontalAlignment="Right"/>
[REr9Y#r8G/b0n"d0<
TextBlockx:Name="lblAddress"Foreground="White"FontSize="18"ITPUB个人空间6S*|2y~#[:D/~f.b4e-E
Grid.Row="2"Grid.Column="1"HorizontalAlignment="Left"
&yT| C5SRrdAN Y0
Text="{BindingAddress,Mode=OneWay}"/>
N{H-vJ rV OS-?0</
Grid>

编写事件处理程序,为了演示把user声明为一个全局的,并在按钮的单击事件中修改其属性值:

public partial classPage:UserControlITPUB个人空间:~`tu|!dB:^qp
{ITPUB个人空间q:E-w;wb6w+] r4c7vH
publicPage()ITPUB个人空间[;Q D&d4h"x0Q? A K
{ITPUB个人空间7r#H-_S{l5q4d
InitializeComponent();ITPUB个人空间8V t P3p ]
}ITPUB个人空间2H8Sd{6{;|
Useruser;ITPUB个人空间!B:IcE)bz w:C1~S
private voidUserControl_Loaded(objectsender,RoutedEventArgse)
[ h h^Ld4}yw6z0{
fd9@};|Fs1Y+ch0user =newUser();ITPUB个人空间Zz@FBC2m
user.Name ="TerryLee";ITPUB个人空间9OMqR)x N3JK)V \ `T
user.Address ="中国 天津";
!@5wg9NH0
P[&M Cn0lblName.DataContext = user;
4^Ead-r!VxM;G0lblAddress.DataContext = user;
4pfZ'~@ yt0}
/h@x;y S:ZF0ITPUB个人空间H ^^Q J?Rq
private voidbtnUpdate_Click(objectsender,RoutedEventArgse)ITPUB个人空间|fbmgpA
{ITPUB个人空间?+r#}+?/L ~!wn
user.Name ="李会军";ITPUB个人空间{W R0dV!c|,g3A ]vH
user.Address ="China Tianjin";ITPUB个人空间k N'\}3U v
}ITPUB个人空间`3S9z]/ga9i0O
}

运行后如下所示:

单击Update按钮后:ITPUB个人空间H uogY"};PiU0Z

Aw:SJw:j_+_(K0

绑定到列表

下面再看一个绑定到列表的简单例子,一般都会使用DataGrid或者ListBox来进行列表数据的显示。下面的示例我们显示一个文章列表:

<GridBackground="#46461F">
_/r/v:j`[,x0<
Grid.RowDefinitions>
c yf*R$bS%]+O-I;v ?r({0<
RowDefinitionHeight="40"></RowDefinition>
l(V$i+P{(l u0<
RowDefinitionHeight="*"></RowDefinition>
j(? c m"Ux0</
Grid.RowDefinitions>ITPUB个人空间D"d.P)?H|{6z
<
Grid.ColumnDefinitions>
DoN L[.gux0<
ColumnDefinition></ColumnDefinition>
I B%` H ]0</
Grid.ColumnDefinitions>ITPUB个人空间'b d^"x2RPqN
<
BorderGrid.Row="0"Grid.Column="0"CornerRadius="15"
O4U2oyl$B yk0
Width="240"Height="36"Background="Orange"
w+f:}]XI+\Xj] h0
Margin="20 0 0 0"HorizontalAlignment="Left">ITPUB个人空间` B)J:O3Se%J3S!X,U
<
TextBlockText="文章列表"Foreground="White"
{ @ z3?^[0
HorizontalAlignment="Left"VerticalAlignment="Center"
_-EN5d}B B5{f9S9d0
Margin="20 0 0 0"></TextBlock>ITPUB个人空间,jNqUM8hh I1q
</
Border>
#M4Nk lN y-B0<
ListBoxx:Name="PostList"Grid.Column="0"Grid.Row="1"ITPUB个人空间0f { gH"_VP
Margin="40 10 10 10"ITPUB个人空间PXFV'x7S;y
HorizontalContentAlignment="Left"VerticalContentAlignment="Bottom"ITPUB个人空间b3lT.D"[[1[
ItemsSource="{BindingPosts}">ITPUB个人空间y&Gb._S8v @$s'r.x
</
ListBox>ITPUB个人空间^?Z7o4U6@Y
</
Grid>

编写一个简单的业务类:

public classBlogITPUB个人空间!C8G#Hm6Y!mi
[
{ITPUB个人空间/g?U1S7t2V7a
publicList<String> Posts {get;set; }
C}vzx:r0}

初始化集合数据并进行绑定

private voidUserControl_Loaded(objectsender,RoutedEventArgse)
6h7WT]3lOm#\@0{ITPUB个人空间 h'n8TE#RKL
Blogblog =newBlog();
OcZg(r(L j0^#S%Jx0blog.Posts =newList<String>
lT1}8z*\1v0{
e]k WMtj~,i0"一步一步学Silverlight 2系列(10):使用用户控件",ITPUB个人空间 yu ]j3`T"n b
"一步一步学Silverlight 2系列(9):使用控件模板",ITPUB个人空间:O1vPgHmKAL
"一步一步学Silverlight 2系列(8):使用样式封装控件观感",ITPUB个人空间+P'x_ c~6i
"一步一步学Silverlight 2系列(7):全屏模式支持"ITPUB个人空间^c4y.R R$pqw Zw
};ITPUB个人空间2?l*JR ah-V;J
ITPUB个人空间.u;j i0c#Z
PostList.DataContext = blog;
2|l VI ]0qZ;E1C0}

最终运行的结果如下所示:

当然我们也可以使用ListBox的ItemsSource属性进行绑定,

结束语

本文简单介绍了Silverlight 2中的数据绑定,你可以从这里下载文章示例代码。

作者:TerryLee
7u,d!Xi!td!WgM"z M0出处:http://terrylee.cnblogs.com

TAG:

引用 删除 Guest   /   2011-06-21 09:14:30
3
引用 删除 fchzh   /   2011-06-12 21:26:27
我的绑定不上不知道为什么????
引用 删除 Guest   /   2010-09-06 16:36:29
引用 删除 Guest   /   2010-09-06 16:36:14
1
引用 删除 Guest   /   2010-02-22 16:52:55
-1
引用 删除 Guest   /   2009-09-09 16:56:19
1
 

评分:0

我来说两句

显示全部

:loveliness: :handshake :victory: :funk: :time: :kiss: :call: :hug: :lol :'( :Q :L ;P :$ :P :o :@ :D :( :)

日历

« 2012-02-10  
   1234
567891011
12131415161718
19202122232425
26272829   

数据统计

  • 访问量: 665814
  • 日志数: 3733
  • 影音数: 7
  • 文件数: 1
  • 建立时间: 2008-01-04
  • 更新时间: 2010-12-31

RSS订阅

Open Toolbar