深入浅出WPF 第二部分(3)

本文深入探讨了XAML中Binding的高级用法,包括如何灵活指定数据源、路径以及不同场景下的数据绑定策略。通过实例演示了如何在XAML和C#代码中高效地实现数据展示,特别关注于没有Path的Binding、多种Source指定方法以及如何利用DataContext作为源。此外,文章还介绍了在特定条件下Binding的自适应性和灵活性,旨在帮助开发者构建更加动态和交互性的UI体验。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

6.3.4 “没有Path”的Binding

如果Binding源本身就是数据且不需要Path来指明,这时我们只需将Path的值设置为"."就可以了。在XAML代码里这个"."可以省略不写,但在C#代码里却不能省略。

    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="25"/>
        </Grid.RowDefinitions>
        <TextBlock Text="{DynamicResource ResourceKey=str1}"/>
    </Grid>
    <Window.Resources>
        <sys:String x:Key="str1">菩提本无树,明镜亦非台。</sys:String>
    </Window.Resources>

    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="25"/>
        </Grid.RowDefinitions>
        <TextBlock x:Name="textBlock1"/>
    </Grid>
    <Window.Resources>
        <sys:String x:Key="str1">菩提本无树,明镜亦非台。</sys:String>
    </Window.Resources>

            var res = this.FindResource("str1") as string;
            this.textBlock1.SetBinding(TextBlock.TextProperty, new Binding(".") { Source = res });

6.3.5 为Binding指定源(Source)的几种方法
  • 把普通CLR类型单个对象指定为Source。如果类型实现了INotifyPropertyChanged接口,则可通过在属性的set语句里激发PropertyChanged事件来通知Binding数据已被更新。
  • 把普通CLR集合类型对象指定为Source,一般是把控件的ItemsSource属性使用Binding关联到一个集合对象上。
  • 把ADO.Net数据对象指定为Source。
  • 使用XMLDataProvider把XML数据指定为Source。
  • 把依赖对象Dependency Object指定为Source。
  • 把容器的DataContext指定为Source。
  • 通过ElementName指定Source(XAML里用的)。
  • 通过Binding的RelativeSource属性相对地指定Source。
  • 把ObjectDataProvider对象指定为Source。
  • 把使用LINQ检索得到的数据对象作为Binding的源。

6.3.5 没有Source的Binding——使用DataContext作为Binding的源

当一个Binding只知道自己的Path而不知道自己的Source时,它会沿着UI元素树一路向树的根部找过去,每路过一个结点就要看看这个结点的DataContext是否具有Path所指定的属性。如果有,那就把这个对象作为自己的source;如果没有,那就继续找下去;如果到了树的根部还没有找到,那这个Binding就没有Source,因而也不会得到数据。

    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="25"/>
            <RowDefinition Height="5"/>
            <RowDefinition Height="25"/>
            <RowDefinition Height="5"/>
            <RowDefinition Height="25"/>
        </Grid.RowDefinitions>
        <TextBox x:Name="textBox1" Grid.Row="0" BorderBrush="Black" Text="{Binding Path=Age}"/>
        <TextBox x:Name="textBox2" Grid.Row="2" BorderBrush="Black" Text="{Binding Path=Id}"/>
        <TextBox x:Name="textBox3" Grid.Row="4" BorderBrush="Black" Text="{Binding Path=Name}"/>
        
        <Grid.DataContext>
            <obj:Student Age="20" Id="100" Name="Anders"/>
        </Grid.DataContext>
    </Grid>

当Binding的Source本身就是数据,不需要使用属性来暴露数据时,Binding的Path可以设置为“.”,亦可以省略不写。现在Source也可以省略不写了。

    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="25"/>
        </Grid.RowDefinitions>
        <TextBox x:Name="textBox1" Grid.Row="0" BorderBrush="Black" Text="{Binding Mode=OneWay}"/>
        
        <Grid.DataContext>
            <sys:String>大话西游</sys:String>
        </Grid.DataContext>
    </Grid>


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值