欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2023-08-26 11:08:14
6.3.4 “没有Path”的Binding 如果Binding源本身就是数据且不需要Path来指明,这时我们只需将Path的值设置为".&qu...

6.3.4 “没有Path”的Binding

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


[html]
<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 Text="{DynamicResource ResourceKey=str1}"/>
    </Grid>
    <Window.Resources>
        <sys:String x:Key="str1">菩提本无树,明镜亦非台。</sys:String>
    </Window.Resources>
[html]
<Grid> 
    <Grid.RowDefinitions> 
        <RowDefinition Height="25"/> 
    </Grid.RowDefinitions> 
    <TextBlock x:Name="textBlock1"/> 
</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>
[csharp]
var res = this.FindResource("str1") as string; 
this.textBlock1.SetBinding(TextBlock.TextProperty, new Binding(".") { Source = res }); 

            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,因而也不会得到数据。


[html]
?<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> 

    <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也可以省略不写了。


[html]
<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> 

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