星期四, 十二月 21, 2006

[翻译]如何决定使用DataContext还是Source?

刚好最近在学习wpf的数据绑定,也想学点英语,所以试着翻译一下有关数据绑定的文章.
这是第一次翻译的文章,还好这篇不是很长:)

如何决定使用DataContext还是Source?

原文出处:http://www.beacosta.com/Archive/2005_09_01_bcosta_archive.html

DataContext是数据绑定的最根本的概念之一
绑定的物件需要从其它地方获取数据,有几种方法能够指定数据的来源.在这篇中我将讲解两种方法,一种是直接在绑定中设定Source属性,另一种是从元素树中最近的上层继承DataContext.另外还有两种替代方法,就是在绑定物件中分别设置ElementName和RelativeSource属性,这个我会留到以后的帖子中说.

例如,假设我们有下面的这些数据源(GreekGod是一个类,定义在在下面的代码中)

<Window.Resources>
   
<local:GreekGod Name="Zeus" Description="Supreme God of the Olympians" RomanName="Jupiter" x:Key="zeus"/>
   
<local:GreekGod Name="Poseidon" Description="God of the sea, earthquakes and horses" RomanName="Neptune" x:Key="poseidon"/>
</Window.Resources>

<StackPanel DataContext="{StaticResource poseidon}">
   
<TextBlock TextContent="{Binding Source={StaticResource zeus}, Path=Name}"/>
   
<TextBlock TextContent="{Binding Path=Description}"/>
   
<TextBlock TextContent="{Binding Path=RomanName}"/>
</StackPanel>

第一个TextBlock继承了继承了StackPanel的DataContext而且绑定的物件也设置了Source.在这种情况下,Source具有优先权,因此该TextBlock绑定到key为"zeus"的资源的Name属性上,显示"Zeus"

第二个TextBlock没有直接设置绑定物件的Source,因此它继承了StackPanel的DataContext.就像你想的这样,它绑定到Key为"poseidon"的资源的Description属性上,显示
"God of the sea, earthquakes and horses".

第三个TextBlock就很明了了,显示"Neptune"

我所看到的数据相关程序,大部分都趋向与使用DataContext而非Source.我的建议是:DataContext只使用在需要绑定数据源的多个属性时.当只要绑定数据源的一个属性时,我通常使用Source.这样方便调试,我只需要在一个地方就能了解到所有的绑定信息,而无需寻找最近的DataContext.在一个小例子中,就像这个例子,看不出很大的好处,但在复杂的程序中就可以节约你不少时间.




由于原来作者的代码比较早期,vs更新后无法编译了.自己小小修改以下:


share your files at box.net

没有评论: