WPF 元素绑定

数据绑定是一种关系,最简单的关系就是 源对象是WPF元素而且源属性是依赖项属性。依赖项属性具有内置的更改通知支持。因此当源对象中改变依赖属性的值时,会立即更新目标对象中的绑定属性。

当使用绑定表达式时,不必对源对象做任何改动,只需配置源对象使其属性具有正确的值范围。

<Slider Grid.Row="0" Name="sliderFontSize" Margin="3" Minimum="1" Maximum="40" Value="10" TickFrequency="1" TickPlacement="TopLeft"> 
</Slider>
<TextBlock Grid.Row="1" Margin="10" Text="Simple Text" Name="lblSimpleText" FontSize="{Binding ElementName=sliderFontSize,Path=Value}">         
</TextBlock>

WPF不会引发异常来通知与数据绑定相关的问题。如果指定的元素或属性不存在,那么不会收到任何的指示;相反,只是不能在目标属性中显示数据。

调试可通过Visual Studio的OutPut窗口查看,WPF会输出绑定细节的跟踪信息

绑定模式

当设置 Binding.Mode 属性时,WPF允许使用 System.Windows.Data.BindingMode 枚举值中的任何一个。

代码创建绑定

Binding binding = new Binding();
binding.Source = slider;
binding.Path = new PropertyPath("Value");
binding.Mode = BindingMode.TwoWay;
textBlock.SetBinding(TextBlock.FontSize, bindig);

可以通过使用 BindingOperation 类的两个静态方法移出绑定,ClearBinding() 使用依赖项属性的引用作为参数; ClearAllBindings() 使用目标元素的引用作为参数。
 

多绑定

可以设置TextBlock元素从文本框中获取文本,从单独的颜色列表中选择当前前景色和背景色,等等。

<TextBlock Grid.Row="1" Margin="10" Name="lblSimpleText"
                   FontSize="{Binding ElementName=sliderFontSize,Path=Value}"
                   Text="{Binding ElementName=txtContent,Path=Text}"
                   Foreground="{Binding ElementName=lstColors,Path=SelectedItem.Tag}"> 
        </TextBlock>

绑定更新

源的变化会立即影响目标,然而反向的传递从目标到源未必会立即发生。他们的行为由Binding.UpdateSourceTrigger属性控制。

表中列出的值不影响目标的更新方式,他们仅控制TwoWay或OneWayToSource模式的绑定中源的更新方式。

绑定延迟

 用户停止输入500毫秒后更新源对象  

<TextBox Text="{Binding ElementName=txtSampleText,Path=FontSize,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged,Delay=500}" Name="txtFontSize">
</TextBox>

绑定到非元素对象

WPF数据绑定基础结构不能获取私有信息或公有字段,必须是公有属性中。

绑定到非元素对象时,需要放弃Binding.ElementName属性,并使用以下属性之一。

  • Source:该属性是指向源对象的引用,提供数据的对象。

  • RelativeSource:这是引用,使用RelativeSource对象指向源对象。有了这个附加层,在在当前元素的基础上构建引用。这似乎增加了复杂程度,

 但实际上RelativeSource属性是一种特殊工具,当编写控件模版及数据模版时是很方便的。

  • DataContext:如果没有使用Source或RelativeSource属性指定源,WPF就从当前元素开始在元素树中向上查找。检查每个属性的DataContext属性,并使用第一个飞空的DataContext属性。

当将同一个对象的多个属性绑定到不同的元素时,DataContext属性是非常有用的,因为可在更高层次的容器对象上,设置DataContext属性。

 Source

绑定到静态对象

<TextBlock Text="{Binding Source={x:Static SystemFonts.IconFontFamily},Path=Source}"></TextBlock>

绑定到资源

<Window.Resources>
        <FontFamily x:Key="CoustomFont">Calibri</FontFamily>
    </Window.Resources>
    <Grid>
        <TextBlock Text="{Binding Source={StaticResource CoustomFont},Path=Source}">    
        </TextBlock>
    </Grid>

RelativeSource

<TextBlock Text="{Binding Path=Title,RelativeSource={RelativeSource FindAncestor,AncestorType={x:Type Window}}}"></TextBlock>

RelativeSource对象使用FindAncestor模式,该模式告知查找元素树知道发现AncestorType属性定义的元素类型。

FindAncestor模式有4种。

DataContext属性

大量元素绑定到同一对象

<TextBlock Text="{Binding Source={x:Static SystemFonts.IconFontFamily},Path=Source}"></TextBlock>
 <TextBlock Text="{Binding Source={x:Static SystemFonts.IconFontFamily},Path=Source}"></TextBlock>
 <TextBlock Text="{Binding Source={x:Static SystemFonts.IconFontFamily},Path=Source}"></TextBlock>

可以改成如下

<StackPanel DataContext="x:Static SystemFonts.IconFontFamily">
        <TextBlock Text="{Binding Path=Source}"></TextBlock>
        <TextBlock Text="{Binding Path=Source}"></TextBlock>
        <TextBlock Text="{Binding Path=Source}"></TextBlock>
 </StackPanel>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值