关键词:
使用Windows Presentation Foundation (WPF) 可以很方便的设计出强大的用户界面,同时 WPF提供了数据绑定功能。WPF的数据绑定跟Winform与ASP.NET中的数据绑定功能类似,但也有所不同,在 WPF中以通过后台代码绑定、前台XAML中进行绑定,或者两者组合的方式进行数据绑定。您可以绑定控件、公共属性、XML 或对象,WPF中的数据绑定跟WinForm与ASP.NET相比,更加快捷、灵活和简单。
一、什么是数据绑定
WPF 中的数据绑定,必须要有绑定目标和要绑定的数据源。绑定目标可以是继承自 DependencyProperty的任何可访问的属性或控件,例如 TextBox 控件的 Text 属性。数据源可以是其他控件的属性,可以是对象实例、XAML 元素、ADO.NET Dataset、XML数据。微软针对XML绑定与对象绑定,提供了两个辅助类XmlDataProvider 和 ObjectDataProvider。
WPF的数据绑定跟ASP.NET与WinForm中的数据绑定有什么不同呢? 最大不同就是WPF使用{Binding …}这一语句。
Binding是用来实现界面控件的属性与后台数据之间的绑定,通过这种形式将前台界面与后台数据联系在一起达到界面与数据耦合的目的。
WPF绑定引擎从 Binding 对象获取有关以下内容的信息:
源对象和目标对象。
数据流的方向。你可以通过设置 Binding.Mode 属性来指定该方向。
值转换器(如果存在)。你可通过将 Converter 属性设置为用来实现 IValueConverter 的类的一个实例,指定值转换器。
WPF与ASP.NET与WinForm中的绑定方式比较,存在着如下几点差异:
(1)Binding可以通过XAML语句实现界面与数据的耦合。如果把Binding比作数据的桥梁,那么它的两端分别是Binding的源和目标。数据从哪里来哪里就是源,Binding是架在中间的桥梁,Binding目标是数据要往哪儿去。一般情况下,Binding源是逻辑层的对象,Binding目标是UI层的控件对象,这样,数据就会源源不断 通过Binding送达UI层,被UI层展现,也就完成了数据驱动UI的过程。如下图。
(2)Binding有一个重要的属性Mode,实现绑定中的数据流向。具体有如下几种。
成员名称 |
说明 |
Default |
使用绑定目标的默认 Mode 值。 每个依赖项属性的默认值都不同。 一般情况下,用户可编辑控件属性(例如文本框和复选框的属性)默认为双向绑定,而多数其他属性默认为单向绑定。 确定依赖项属性绑定在默认情况下是单向还是双向的编程方法是:使用 GetMetadata 获取属性的属性元数据,然后检查 BindsTwoWayByDefault 属性的布尔值。 |
OneTime |
当应用程序启动或数据上下文更改时,更新绑定目标。 此绑定类型适用于以下情况:使用当前状态的快照适合使用的或数据状态实际为静态的数据。 如果要从源属性初始化具有某个值的目标属性,并且事先不知道数据上下文,则也可以使用此绑定类型。 此绑定类型实质上是 OneWay 绑定的简化形式,在源值不更改的情况下可以提供更好的性能。 |
OneWay |
当绑定源(源)更改时,更新绑定目标(目标)属性。 此绑定类型适用于绑定的控件为隐式只读控件的情况。 例如,可以绑定到如股市代号之类的源。 或者,可能目标属性没有用于进行更改(例如表的数据绑定背景色)的控件接口。 如果无需监视目标属性的更改,则使用 OneWay 绑定模式可避免 TwoWay 绑定模式的系统开销。 |
OneWayToSource |
当目标属性更改时更新源属性。 |
TwoWay |
导致对源属性或目标属性的更改可自动更新对方。 此绑定类型适用于可编辑窗体或其他完全交互式 UI 方案。 |
(3)可通过配置触发器,决定用户在界面输入的数据在什么时候去修改数据源中的值。可以通过UpdateSourceTrigger属性实现,具体有如下几种值
成员名称 |
说明 |
Default |
绑定目标属性的默认 UpdateSourceTrigger 值。 大多数依赖项属性的默认值都为 PropertyChanged,而Text 属性的默认值为 LostFocus。 确定依赖项属性的默认 UpdateSourceTrigger 值的编程方法是使用 GetMetadata 来获取属性的属性元数据,然后检查 DefaultUpdateSourceTrigger 属性的值。 |
Explicit |
仅在调用 UpdateSource 方法时更新绑定源。 |
LostFocus |
当绑定目标元素失去焦点时,更新绑定源。 |
PropertyChanged |
当绑定目标属性更改时,立即更新绑定源。 |
|
|
具体用法如下:
<TextBox Name="itemNameTextBox" Text="{Binding Path=ItemName, UpdateSourceTrigger=Explicit}" />
二、简单的绑定
接下来是本文的第一个示例,一个非常简单的绑定示例,该示例演示如何通过绑定的方式把ListBox中选中的值显示到 TextBlock中。
首先,给ListBox添加了七个 ListBoxItem,做为ListBox的选项 。
其次,把第二个 TextBlock 的 Text通过 Binding 与 ListBox 选择项进行绑定。Binding 语法中的 ElementName 属性指示 TextBlock 的 Text 属性要与其绑定的控件的名称。Path 属性指示我们将绑定到Text属性上ListBox元素的属性。具体代码如下。
<Window x:Class="WpfApp1.WindowBindData" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="WindowBindData" Height="400" Width="500"> <Grid> <Grid.RowDefinitions> <RowDefinition Height="150"/> <RowDefinition Height="150"/> <RowDefinition Height="138*"/> </Grid.RowDefinitions> <StackPanel Grid.Row="0"> <TextBlock Width="248" Height="24" Text="股票名称:" TextWrapping="Wrap"/> <ListBox x:Name="listStockName" Width="248" Height="56"> <ListBoxItem Content="全通教育"/> <ListBoxItem Content="大智慧"/> <ListBoxItem Content="宝钢股份"/> <ListBoxItem Content="浦发银行"/> <ListBoxItem Content="工商银行"/> <ListBoxItem Content="中国建筑"/> <ListBoxItem Content="中国南车"/> </ListBox> <TextBlock Width="248" Height="24" Text="你所选中的股票名称:" /> <TextBlock Width="248" Height="24" Text="{Binding ElementName=listStockName, Path=SelectedItem.Content}"> </TextBlock> </StackPanel> </Grid> </Window>
效果如下图。
wpf入门教程系列十七——wpf中的数据绑定
四、XML数据绑定 这次我们来学习新的绑定知识,XML数据绑定。XmlDataProvider用来绑定XML数据,该XML数据可以是嵌入.Xmal文件的XmlDataProvider标记中,也可以是外部位置引用的文件中。 当然嵌入式XML内容... 查看详情
wpf入门教程系列二十一——datagrid示例
DataGrid示例的后台代码1) 通过EntityFramework6.1从数据库(本地数据库(local)/Test中的S_City表中读取城市信息数据,从S_Province表中读取省份信息,然后通过绑定的方式反数据显示到WPF的Window上的一个DataGrid上。具体代码如下。usingSys... 查看详情
wpf入门教程系列二十——listview示例
第四步、WPF后台逻辑代码编写在后台用EntityFramework6.1的CodeFirst方式获取数据库中的数据。同时,在“刷新”按钮的方法中进行数据绑定。操作步骤如下:1) 在“刷新”按钮上使用鼠标右键,单击,会弹出“属性”窗口。如下... 查看详情
wpf入门教程系列十一——依赖属性
一、依赖属性基本介绍 本篇开始学习WPF的另一个重要内容依赖属性。 大家都知道WPF带来了很多新的特性,其中一个就是引入了一种新的属性机制——依赖属性。依赖属性出现的目的是用来实现WPF中的样式、... 查看详情
WPF 用户控件中的数据绑定
...2012-06-2822:08:27【问题描述】:我正在为多个窗口共享的一系列控件创建一个UserControl。其中一个控件是一个标签,它以“协议号”的形式显示其他一些流程的流程。我正在尝试使用此标签提供DataBinding,以便窗口在协议编号变量... 查看详情
WPF 用户控件中的数据绑定
...2022-01-0522:42:54【问题描述】:我正在为多个窗口共享的一系列控件创建一个UserControl。其中一个控件是一个标签,它以“协议号”的形式显示其他一些流程的流程。我正在尝试使用此标签提供DataBinding,以便窗口在协议编号变量... 查看详情
wpf入门教程系列十九——listview示例
经过前面的学习,今天我做一个比较综合的WPF程序示例,主要包括以下功能: 1) 查询功能。从数据库(本地数据库(local)/Test中的S_City表中读取城市信息数据,然后展示到WPF的Window上的一个ListView上。2) 数据联动功... 查看详情
mvvm设计模式和在wpf中的实现事件绑定
系列目录:MVVM模式解析和在WPF中的实现(一)MVVM模式简介MVVM模式解析和在WPF中的实现(二)数据绑定MVVM模式解析和在WPF中的实现(三)命令绑定MVVM模式解析和在WPF中的实现(四)事件绑定MVVM模式解析和在WPF中的实现(五)Vie... 查看详情
wpf入门《数据绑定》
简单而言,数据绑定是一种关系,这种关系告诉WPF从一个源目标对象中提取一些信息,并且使用该信息设置为目标对象的属性。目标属性总是依赖项属性,并且通常位于WPF元素中。 然而,源对象可以是任何内容,可是是随机生成... 查看详情
wpf入门教程系列二十一——datagrid示例
前面我们学习了ListView控件的使用示例,今天我们来学习DataGrid的有关知识。提到DataGrid不管是Asp.Net中的网页开发还是WinForm应用程序开发都会频繁使用。通过它我们可以灵活的在行与列间显示各种数据。本篇将学习WPF中的Data... 查看详情
wpf教程:依赖属性
...且可以通过绑定从其他数据源获取值。依赖属性可支持WPF中的样式设置、数据绑定、继承、动画及默认值。将所有的属性都设置为依赖属性并不总是正确的解决方案,具体取决于其应用场景。有时,使用私有字段实现属性的典型... 查看详情
wpf入门教程系列十三——依赖属性
四、只读依赖属性 在以前在对于非WPF的功能来说,对于类的属性的封装中,经常会对那些希望暴露给外界只读操作的字段封装成只读属性,同样在WPF中也提供了只读属性的概念,如一些WPF控件的依赖属性是只读的,它们经常... 查看详情
数据绑定如何避免 WPF 中的递归更新?
】数据绑定如何避免WPF中的递归更新?【英文标题】:HowdoesdatabindingavoidrecursiveupdateinWPF?【发布时间】:2011-02-2122:29:57【问题描述】:我正在研究WPF中的绑定,然后我有一个问题:假设依赖属性绑定到实现INotifyPropertyChanged接口的... 查看详情
WPF 中的数据网格绑定
】WPF中的数据网格绑定【英文标题】:DatagridbindinginWPF【发布时间】:2011-08-1404:01:09【问题描述】:我知道这已经被问过了,但我已经做了开发人员建议的几乎所有事情。<DataGridx:Name="Imported"VerticalAlignment="Top"DataContext="BindingSour... 查看详情
数据绑定到 WPF 中的方法
】数据绑定到WPF中的方法【英文标题】:DatabindingtoamethodinWPF【发布时间】:2010-02-2107:37:06【问题描述】:我在将TextBox.Text属性数据绑定到对象的方法时遇到问题。这个想法是允许用户在TextBox中写入一个文件名,然后让TextBlock输... 查看详情
WPF 数据验证中的绑定失败
】WPF数据验证中的绑定失败【英文标题】:FailedBindinginWPFDataValidation【发布时间】:2012-12-2213:32:54【问题描述】:我正在尝试将我的控件样式中的属性绑定到控件中定义的属性。该控件继承自TextBox,称为ChangeTextBoxWithRangeUnits。我... 查看详情
wpf中的数据绑定
WPF中的数据绑定绑定模式 通过上一文章中的示例,学习了简单的绑定方式。在这里的示例,要学习一下绑定的模式,和模式的使用效果。 首先,我们来做一个简单示例,这个示例是根据ListBox中的选中项... 查看详情
wpf中的数据绑定
WPF中的数据绑定绑定模式 通过上一文章中的示例,学习了简单的绑定方式。在这里的示例,要学习一下绑定的模式,和模式的使用效果。 首先,我们来做一个简单示例,这个示例是根据ListBox中的选中项... 查看详情