服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C# - WPF基础教程之元素绑定详解

WPF基础教程之元素绑定详解

2022-03-07 13:28SmilelyCoding C#

这篇文章主要给大家介绍了关于WPF基础教程之元素绑定的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

前言

简单的说,数据绑定是一种关系,该关系告诉WPF从一个源对象提取一些信息,并使用这些信息设置目标对象的属性。目标属性总是以来属性,并且通常位于WPF元素中,毕竟,WPF数据绑定的最终目的是在用户界面中显示一些信息。然而,源对象可以是任何内容,从另一个WPF元素到ADO.NET数据对象(如DataTable和DataRow对象)或自己创建的纯数据对象。

下面话不多说了,来一起看看详细的介绍吧

元素绑定

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

绑定表达式

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

?
1
2
3
4
<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会输出绑定细节的跟踪信息。

绑定模式

 

名称 说明
OneWay 当源属性变化时更新目标属性。
TwoWay 当源属性变化时更新目标属性,并且当目标属性变化时更新源属性。
OneTime 最初根据源属性设置目标属性,然而,其后的所有改变都会被忽略。通常如果知道属性不会变化,可通过这种模式降低开销。
OneWayToSource 与OneWay相反,当目标属性变化时更新源属性。
Default 此类绑定依赖于目标属性,既可以是双向的,也可以是单向的。除非明确指定了一种绑定模式,否则所有绑定使用该方法

 

使用代码创建绑定

?
1
2
3
4
5
Binding binding = new Binding();
binding.Source = sliderFontSize;
binding.Path = new PropertyPath("Value");
binding.Mode = BindingMode.TwoWay;
lblSimpleText.SetBinding(TextBlock.FontSizeProperty,binding);

多绑定

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

?
1
2
3
4
5
<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>

还可链接数据绑定。例如TextBox.Text属性创建表达式以链接到TextBlock.FontSize属性,而TextBlock.FontSize又链接到Slider.Value属性的绑定表达式。

绑定更新

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

 

名称
说明
PropertyChanged 当目标属性变化时立即更新源。
LostFocus 当目标属性变化并且目标属性失去焦点时跟新源。
Explicit 除非调用BindingExpression.UpdateSource()方法,否则无法更新源。
Default 根据目标属性的元素确定更新行为。大多数属性的默认行为是PropertyChanged,但TextBox.Text属性的默认行为是LostFocus

 

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

绑定延迟

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

?
1
2
<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

绑定到静态对象

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

2.绑定到资源

?
1
2
3
4
5
6
<Window.Resources>
 <FontFamily x:Key="CoustomFont">Calibri</FontFamily>
</Window.Resources>
<Grid>
 <TextBlock Text="{Binding Source={StaticResource CoustomFont},Path=Source}"></TextBlock>
</Grid>

RelativeSource

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

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

 

名称                 
说明
Self 表达式绑定到同一元素的另一个属性上。
FindAncestor 表达式绑定到父元素。WPF将查找元素树直至发现期望的父元素。为了指定父元素,还必须设置AncestorType属性以指示希望查找的父元素类型。此外,还可以用AncestorLevel属性略过发现的一定的数量的特定元素。例如当一棵树中查找时,如果希望绑定到第三个ListBoxItem类型的元素,应当使用如下设置,AncestorType={x:Type ListBoxItem};并且AncestorLevel=3,从而略过前连个ListBoxItem元素。默认值是1,并在找到第一个匹配的元素停止查找。
PreviousData 表达式绑定到数据绑定列表中前一个数据项。在列表中使用这种模式。
TemplateParent 表达式绑定到应用模版的元素。只有当绑定位于控件模版或数据模版内部时,这种模式才能工作。

 

DataContext属性

大量元素绑定到同一对象。

?
1
2
3
<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>

可以改成如下

?
1
2
3
4
5
<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>

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对服务器之家的支持。

原文链接:https://www.cnblogs.com/lovezhangyu/p/10208381.html

延伸 · 阅读

精彩推荐
  • C#C#基础之泛型

    C#基础之泛型

    泛型是 2.0 版 C# 语言和公共语言运行库 (CLR) 中的一个新功能。接下来通过本文给大家介绍c#基础之泛型,感兴趣的朋友一起学习吧...

    方小白7732021-12-03
  • C#Unity3D UGUI实现缩放循环拖动卡牌展示效果

    Unity3D UGUI实现缩放循环拖动卡牌展示效果

    这篇文章主要为大家详细介绍了Unity3D UGUI实现缩放循环拖动展示卡牌效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参...

    诗远3662022-03-11
  • C#C#实现的文件操作封装类完整实例【删除,移动,复制,重命名】

    C#实现的文件操作封装类完整实例【删除,移动,复制,重命名】

    这篇文章主要介绍了C#实现的文件操作封装类,结合完整实例形式分析了C#封装文件的删除,移动,复制,重命名等操作相关实现技巧,需要的朋友可以参考下...

    Rising_Sun3892021-12-28
  • C#C#直线的最小二乘法线性回归运算实例

    C#直线的最小二乘法线性回归运算实例

    这篇文章主要介绍了C#直线的最小二乘法线性回归运算方法,实例分析了给定一组点,用最小二乘法进行线性回归运算的实现技巧,具有一定参考借鉴价值,需要...

    北风其凉8912021-10-18
  • C#C# 后台处理图片的几种方法

    C# 后台处理图片的几种方法

    本篇文章主要介绍了C# 后台处理图片的几种方法,非常具有实用价值,需要的朋友可以参考下。...

    IT小伙儿10162021-12-08
  • C#浅谈C# winForm 窗体闪烁的问题

    浅谈C# winForm 窗体闪烁的问题

    下面小编就为大家带来一篇浅谈C# winForm 窗体闪烁的问题。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...

    C#教程网7962021-12-21
  • C#聊一聊C#接口问题 新手速来围观

    聊一聊C#接口问题 新手速来围观

    聊一聊C#接口问题,新手速来围观,一个通俗易懂的例子帮助大家更好的理解C#接口问题,感兴趣的小伙伴们可以参考一下...

    zenkey7072021-12-03
  • C#c#学习之30分钟学会XAML

    c#学习之30分钟学会XAML

    一个界面程序的核心,无疑就是界面和后台代码,而xaml就是微软为构建应用程序界面而创建的一种描述性语言,也就是说,这东西是搞界面的...

    C#教程网8812021-12-10