星期五, 十二月 22, 2006

"{Binding}"是什么意思?

"{Binding}"是什么意思?

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

你在例子中看到的绑定大都有设置Source和Path属性.Source指定你所绑定的物体,Path指定该物体中你所兴趣的属性.

我看到过一些人第一次看到"{Binding}"时很困惑.它乍看起来就像我们没有为绑定给出足够的信息似的,这是不正确,我将会解释为什么.

如果你读过我以前的帖子,你就会知道并不是一定要为绑定设置Source的,只要在元素树的上层设置过DataContext就可以了.

至于Path,如果你想绑定整个物体,而只是物体的一个属性,就可以不要Path.一种情形就是当你只是简单的想绑定一个String(而不是它的Length属性)

<Window.Resources>
    <system:String x:Key="helloString">Hello</system:String>
</Window.Resources>

<Border DataContext="{StaticResource helloString}">
    <TextBlock TextContent="{Binding}"/>
</Border>

另一种常见的情形就是你想绑定一个元件到一个物体的多个属性.

<Window.Resources>
    <local:GreekGod Name="Zeus" Description="Supreme God of the Olympians" RomanName="Jupiter" x:Key="zeus"/>
</Window.Resources>

<Border DataContext="{StaticResource zeus}">
    <ContentControl Content="{Binding}"/>
</Border>

在这种情况下ContentControl不知道如何显示GreekGod数据.因此你只能看到ToString()的结果,当然这通常不是你想要的.但你可以使用DataTemplate,它允许你指定你数据的外观.

<Window.Resources>
    <local:GreekGod Name="Zeus" Description="Supreme God of the Olympians" RomanName="Jupiter" x:Key="zeus"/>

    <DataTemplate x:Key="contentTemplate">
        <DockPanel>
            <TextBlock Foreground="RoyalBlue" TextContent="{Binding Path=Name}" />
            <TextBlock TextContent=":" Margin="0,0,5,0" />
            <TextBlock Foreground="Silver" TextContent="{Binding Path=Description}" />
        </DockPanel>
    </DataTemplate>
</Window.Resources>

<Border DataContext="{StaticResource zeus}">
    <ContentControl Content="{Binding}" ContentTemplate="{StaticResource contentTemplate}"/>
</Border>

注意,任何DataTemplate内部的绑定声明都没有Source.那是因为它有一个DataContext被自动设置为被模板化的数据物件了.


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

share your files at box.net

没有评论: