随笔 - 229  文章 - 2  评论 - 511  阅读 - 84万

{Binding}详释 (WPF)

大多数的绑定操作都设置了SourcePath属性。Source属性用于确定绑定的对象,而Path属性确定对象中的属性。

很多人遇到{Binding}时都会很困惑. {Binding} 乍看起来好像缺少可用信息。实际上不是这样的,现在我对此解释一下

    如果你阅读过我的上一篇文章,你应该知道:在控件树的上层里可以设置DataContext属性,所以并不一定要设置Source属性。

     现在说说Path. 当要绑定的是整个对象而不是其中的单个属性时,Path是可以省略的。其中的一种情况是:当数据源是一个string类型并且仅仅绑定其本身时,可以省略Path

例如:

 

<Window x:Class="Test.Window1"

    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

    Title="Test" Height="300" Width="300"

    xmlns:c="clr-namespace:System;assembly=mscorlib"

    >

  <Window.Resources>

    <c:String x:Key="helloString">Hello</c:String>

  </Window.Resources>

 

  <Border DataContext="{StaticResource helloString}">

    <TextBlock Text="{Binding}"/>

  </Border>

 

</Window>

 

另外一种使用{Binding}的情况是:将元素对应地绑定到对象的属性上:

<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>

    <c:String x:Key="helloString">Hello</c:String>

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

 

    <DataTemplate x:Key="contentTemplate">

      <DockPanel>

        <TextBlock Foreground="RoyalBlue" Text="{Binding Path=Name}" />

        <TextBlock Text=":" Margin="0,0,5,0" />

        <TextBlock Foreground="Silver" Text="{Binding Path=Description}" />

      </DockPanel>

    </DataTemplate>

  </Window.Resources>

 

  <StackPanel>

    <Border BorderBrush="RoyalBlue" BorderThickness="2" Margin="25,25,25,0" Padding="5" DataContext="{StaticResource helloString}">

      <TextBlock Text="{Binding}"/>

    </Border>

 

    <Border BorderBrush="RoyalBlue" BorderThickness="2" Margin="25" Padding="5" DataContext="{StaticResource zeus}">

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

    </Border>

  </StackPanel>

</Window>

 

 

需要注意的是:DataContext对象会自动应用到模板化的对象里,所以{Binding}实际上已经被指定了数据源

  

原文地址:What does "{Binding}" mean?

译者注:Beatriz Costa写本时的winfx版本是BETA 1,现在已经不能使用了。我改动了部分代码。放在这里供大家下载

代码下载

posted on   stswordman  阅读(6238)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
< 2006年12月 >
26 27 28 29 30 1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31 1 2 3 4 5 6

点击右上角即可分享
微信分享提示