当前位置: 首页 > 编程日记 > 正文

数据绑定(Binding)

Windows Presentation Foundation (WPF) 中的数据绑定为应用程序提供了一种简单、一致的数据表示和交互方法。元素能够以公共语言运行时 (CLR) 对象和 XML 形式绑定到来自各种数据源的数据。

什么是数据绑定?

数据绑定是在应用程序 UI 与业务逻辑之间建立连接的过程。如果绑定具有正确设置并且数据提供正确通知,则当数据更改其值时,绑定到数据的元素会自动反映更改。数据绑定可能还意味着如果元素中数据的外部表现形式发生更改,则基础数据可以自动更新以反映更改。例如,如果用户编辑 TextBox 元素中的值,则基础数据值会自动更新以反映该更改。

基本数据绑定概念

不论要绑定什么元素,不论数据源的特性是什么,每个绑定都始终遵循下图所示的模型:
这里写图片描述
如上图所示,数据绑定实质上是绑定目标与绑定源之间的桥梁。该图演示以下基本的 WPF 数据绑定概念:

  • 通常,每个绑定都具有四个组件:绑定目标对象、目标属性、绑定源,以及要使用的绑定源中的值的路径。例如,如果要将 TextBox 的内容绑定到 Employee 对象的 Name 属性,则目标对象是 TextBox,目标属性是 Text 属性,要使用的值是 Name,源对象是 Employee 对象。
  • 目标属性必须为依赖项属性。大多数 UIElement 属性都是依赖项属性,而大多数依赖项属性(除了只读属性)默认情况下都支持数据绑定。(只有DependencyObject 类型可以定义依赖项属性,所有 UIElement 都派生自 DependencyObject。)
  • 尽管图中并未指出,但应该注意,绑定源对象并不限于自定义 CLR 对象。WPF 数据绑定支持 CLR 对象和 XML 形式的数据。举例来说,绑定源可以是 UIElement、任何列表对象、与 ADO.NET 数据或 Web 服务关联的 CLR 对象,或是包含 XML 数据的 XmlNode。有关更多信息,请参见绑定源概述
    特别注意:当建立绑定时,是将绑定目标绑定到 绑定源。例如,如果要使用数据绑定在一个 ListBox 中显示一些基础 XML 数据,就是将 ListBox 绑定到 XML 数据。

数据流的方向

正如上文所述和上图中箭头所示,绑定的数据流可以从数据目标流向数据源(例如,当用户编辑 TextBox 的值时,源值会发生更改)和/或(如果绑定源提供正确的通知)从绑定源流向绑定目标(例如,TextBox 内容会随绑定源中的更改而进行更新)。
有时可能希望应用程序使用户可以更改数据并将数据传播回源对象。或者,可能不希望允许用户更新源数据。可以通过设置 Binding 对象的 Mode 属性来对此进行控制。下图演示不同类型的数据流:

这里写图片描述

  • OneWay 绑定导致对源属性的更改会自动更新目标属性,但是对目标属性的更改不会传播回源属性。此绑定类型适用于绑定的控件为隐式只读控件的情况。例如,可能绑定到如股票行情自动收录器这样的源,或许目标属性没有用于进行更改的控件接口(如表的数据绑定背景色)。如果无需监视目标属性的更改,则使用 OneWay 绑定模式可避免 TwoWay 绑定模式的系统开销。
  • TwoWay 绑定导致对源属性的更改会自动更新目标属性,而对目标属性的更改也会自动更新源属性。此绑定类型适用于可编辑窗体或其他完全交互式 UI 方案。大多数属性都默认为 OneWay 绑定,但是一些依赖项属性(通常为用户可编辑的控件的属性,如 TextBox 的 Text 属性和 CheckBox 的 IsChecked 属性)默认为 TwoWay 绑定。确定依赖项属性绑定在默认情况下是单向还是双向的编程方法是:使用 GetMetadata 获取属性的属性元数据,然后检查 BindsTwoWayByDefault 属性的布尔值。
  • OneWayToSource 与 OneWay 绑定相反;它在目标属性更改时更新源属性。一个示例方案是您只需要从 UI 重新计算源值的情况。
  • OneTime 绑定未在图中显示,该绑定会导致源属性初始化目标属性,但不传播后续更改。这意味着,如果数据上下文发生了更改,或者数据上下文中的对象发生了更改,则更改会反映在目标属性中。如果您使用的数据的当前状态的快照适于使用,或者这些数据是真正静态的,则适合使用此绑定类型。如果要使用源属性中的某个值初始化目标属性,并且事先不知道数据上下文,则也可以使用此绑定类型。此绑定类型实质上是 OneWay 绑定的简化形式,在源值不更改的情况下可以提供更好的性能。
    特别注意:若要检测源更改(适用于 OneWay 和 TwoWay 绑定),则源必须实现一种合适的属性更改通知机制(如 INotifyPropertyChanged)。有关 INotifyPropertyChanged 实现的示例,请参见如何:实现属性更改通知。

触发源更新的原因

TwoWay 或 OneWayToSource 绑定侦听目标属性的更改,并将这些更改传播回源。这称为更新源。例如,可以编辑文本框中的文本以更改基础源值。
但是,源值是在您编辑文本的同时进行更新,还是在您结束编辑文本并将鼠标指针从文本框移走后才进行更新呢?绑定的 UpdateSourceTrigger 属性确定触发源更新的原因。下图中右箭头的点演示 UpdateSourceTrigger 属性的角色:

这里写图片描述

如果 UpdateSourceTrigger 值为 PropertyChanged,则 TwoWay 或 OneWayToSource 绑定的右箭头指向的值会在目标属性更改时立刻进行更新。但是,如果 UpdateSourceTrigger 值为 LostFocus,则仅当目标属性失去焦点时,该值才会使用新值进行更新。
与 Mode 属性类似,不同的依赖项属性具有不同的默认 UpdateSourceTrigger 值。大多数依赖项属性的默认值都为 PropertyChanged,而 Text 属性的默认值为 LostFocus。这意味着,只要目标属性更改,源更新通常都会发生,这对于 CheckBox 和其他简单控件很有用。但对于文本字段,每次键击之后都进行更新会降低性能,用户也没有机会在提交新值之前使用退格键修改键入错误。这就是为什么 Text 属性的默认值是 LostFocus 而不是 PropertyChanged 的原因。

创建绑定

前面几节中讨论的一些概念可以概括为:使用 Binding 对象建立绑定,每个绑定通常都具有四个组件:绑定目标、目标属性、绑定源、要使用的源值的路径。本节讨论如何设置绑定。
请看下面的示例,其中的绑定源对象是一个名为 MyData 的类,该类在 SDKSample 命名空间中定义。出于演示的目的,MyData 类具有一个名为 ColorName 的字符串属性,该属性的值设置为“Red”。因此,此示例生成一个具有红色背景的按钮。
C#:

<DockPanel
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:c="clr-namespace:SDKSample"><DockPanel.Resources><c:MyData x:Key="myDataSource"/></DockPanel.Resources><DockPanel.DataContext><Binding Source="{StaticResource myDataSource}"/></DockPanel.DataContext><Button Background="{Binding Path=ColorName}"Width="150" Height="30">I am bound to be RED!</Button>
</DockPanel>

如果将此示例应用于基本关系图,则生成的图如下所示。这是一个 OneWay 绑定,因为 Background 属性在默认情况下支持 OneWay 绑定。

这里写图片描述

指定绑定源

请注意,在上一个示例中,绑定源是通过设置 DockPanel 元素上的 DataContext 属性来指定的。Button 随后从 DockPanel(这是其父元素)继承 DataContext 值。在这里重复一下,绑定源对象是绑定的四个必需组件之一。因此,如果未指定绑定源对象,则绑定将没有任何作用。
可通过多种方法指定绑定源对象。在将多个属性绑定到相同源时,可以使用父元素上的 DataContext 属性。但是,在各个绑定声明上指定绑定源有时可能更为合适。对于上一个示例,可以不使用 DataContext 属性,而是通过在按钮的绑定声明上直接设置 Source 属性来指定绑定源,如下面的示例中所示:

<DockPanel.Resources><c:MyData x:Key="myDataSource"/>
</DockPanel.Resources>
<Button Width="150" Height="30"Background="{Binding Source={StaticResource myDataSource},Path=ColorName}">I am bound to be RED!</Button>

除了在元素上直接设置 DataContext 属性、从上级继承 DataContext 值(如第一个示例中的按钮)、通过设置 Binding 上的 Source 属性来显式指定绑定源(如最后一个示例中的按钮),还可以使用 ElementName 属性或 RelativeSource 属性指定绑定源。当绑定到应用程序中的其他元素时(例如在使用滑块调整按钮的宽度时),ElementName 属性是很有用的。当在 ControlTemplate 或 Style 中指定绑定时,RelativeSource 属性是很有用的。

指定值的路径

  • 如果绑定源是一个对象,则可使用 Path 属性指定要用于绑定的值。如果要绑定到 XML 数据,则可使用 XPath 属性指定该值。在某些情况下,可以使用 Path 属性,即使在数据为 XML 时。例如,如果要访问返回的 XmlNode(作为 XPath 查询的结果)的 Name 属性,则应使用 Path 属性和 XPath 属性。
  • 请注意,虽然我们已强调要使用的值的 Path 是绑定的四个必需组件之一,但在要绑定到整个对象的情况下,要使用的值会与绑定源对象相同。在这些情况下,不指定 Path 比较合适。请看下面的示例:

C#:

<ListBox ItemsSource="{Binding}"IsSynchronizedWithCurrentItem="true"/>
  • 上面的示例使用空绑定语法:{Binding}。在此情况下,ListBox 从父 DockPanel 元素继承 DataContext(此示例中未演示)。当未指定路径时,默认为绑定到整个对象。换句话说,在此示例中路径已被省略,因为要将 ItemsSource 属性绑定到整个对象。
  • 除了绑定到集合以外,在希望绑定到整个对象,而不是仅绑定到对象的单个属性时,也可以使用此方案。例如,在源对象为类型字符串,并且您仅仅希望绑定到该字符串本身时。

参考资料:数据绑定概述 https://msdn.microsoft.com/zh-cn/library/ms752347(v=vs.90).aspx

版权声明:本文为博主原创文章,未经博主允许不得转载。

转载于:https://www.cnblogs.com/gongchuangsu/p/4850202.html

相关文章:

java exception源码_Java异常之 Error 和 Exception

简单了解 Java 异常1、实际工作中&#xff0c;遇到的情况不可能是非常完美的。比如&#xff1a;你写的某个模块&#xff0c;用户输入不一定符合你的要求&#xff1b;你的程序要打开某个文件&#xff0c;这个文件可能不存在或者文件格式不对&#xff1b;你要读取数据库的数据&am…

面向对象解决了全局变量问题?

2019独角兽企业重金招聘Python工程师标准>>> 全局变量的应用场景 程序中的某些资源之多能有一个&#xff0c;比如计数器、配置信息、程序运行状态等&#xff0c;而且许多地方需要访问他&#xff0c;那么这个资源就应该&#xff0c;也只能设置成全局变量。在稍微大点…

物理层UL基本流程

物理层发端的基本流程在36.211/36.212(NR:38.211/38.212)中有详细的描述&#xff0c;现在归纳如下。下面列出的每个步骤对于某些信道而言可能会增加其它步骤&#xff0c;也可能有些步骤不需要。 CRC 相关 信道编码(channel coding) LTE: NR: 加扰-Scrambling 加扰过程是da…

java 建树源码_Java实现的二叉树常用操作【前序建树,前中后递归非递归遍历及层序遍历】...

import java.util.ArrayDeque;import java.util.Queue;import java.util.Stack;//二叉树的建树&#xff0c;前中后 递归非递归遍历 层序遍历//Node节点class Node {int element;Node left;Node right;public Node() {}public Node(int element) {this.element element;}}// Bi…

html5小趣味知识点系列(一)autofocus

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>autofocus</title> </head> <body><input type"text" autofocus value"页面中只能有一个哦"><!-- 如…

cisco aaa 授权后门测试

最近遇到一个客户aaa没有正确的配置&#xff0c;导致自己被关在设备外面的case&#xff1b;由于是生产环境的多交换机堆叠单元&#xff0c;重启忽略配置也是不允许的&#xff0c;且必须远程操作解决&#xff0c;无疑提升了解决问题的难度。多次尝试后发现通过cisco acs上的一些…

hive的基本命令

创建表 CREATE TABLE pokes (foo INT, bar STRING); 创建表并创建索引字段ds CREATE TABLE invites (foo INT, bar STRING) PARTITIONED BY (ds STRING); 显示所有表 SHOW TABLES; 按正条件&#xff08;正则表达式&#xff09;显示表&#xff0c; SHOW TABLES .*s; 表添加一列…

MMSE(Minimum Mean Square Error)

MMSE是一种最小化接收数据的MSE(均方误差)的模型。关于这句话&#xff0c;你的脑海里就会出现很多问题: 什么是均方误差? “最小化MSE”的物理意义是什么? 让我们从一个我们现在非常熟悉的信道模型开始. MMSE作为一种均衡器&#xff0c;是一种后处理算法&#xff0c;它帮助…

java控制台两个字符串_java控制台输入字符串

实验要求: 1/7 1.掌握 JDK 的安装及参数配置方法,能在控制台界面使用 Java 命令进行 Java 程序的编译及运行。 2.掌握 Eclipse 软件安装方法。3.掌握在 ......习题1. 数据类型转换应用【案例简介】下例说明了整型、浮点型、字符串型之间的相互转换。 【案例目的】掌握 Java 中两…

lua单链表实现

List {}--创建一个节点function List.new(val)return {pnext nil, value val}end--往一个节点后添加一个节点function List.addNode(nodeParent, nodeChild)nodeChild.pnext nodeParent.pnextnodeParent.pnext nodeChildreturn nodeChildend--输出链表function List.print…

Java语言的基础知识9

第十一章(线程)1、通过String nameThread.currentThread().getName();来获取当前线程的名称。2、多次启动一个线程或者启动一个已经运行的线程是非法的,会抛出IllegalThreadStateException异常对象。Thread.sleep((int)Math.random()*10000);3、java提供了Runnable接口使继承了…

Android Parcelable的介绍与使用

Parcelable使用的一个地方就是在进程间传递一个自定义的较为复杂的对象&#xff0c;对Parcelable学习了一下写下自己的观点。 将一个对象比如说一个名字为Cartoon的自定义类&#xff0c;由一个activity传递到另外一个activity去&#xff0c;这个时候就要用到Parcelable了。首先…

LTE PUCCH F2 TX/RX汇总

TX TX端的公式如下(下图来自sharetechnote)&#xff1a; 发送端在36.212/36.211中有详细的描述&#xff0c;就是一系列的数学运算&#xff0c;过程概括如下&#xff1a; 编码、加扰、调制的过程暂不介绍&#xff0c;主要介绍下上图中乘以r_uv的过程&#xff0c;公式如下&#…

面试题:查询连续出现的数字

难度&#xff1a;中等 写一段SQL查询至少连续出现3次的数字。 --------- | Id | Num | --------- | 1 | 1 | | 2 | 1 | | 3 | 1 | | 4 | 2 | | 5 | 1 | | 6 | 2 | | 7 | 2 | --------- 例如&#xff1a;上图表 Logs&#xff0c; 1 是唯一一个连续出现3次的…

php的数组排序方法,PHP数组排序函数

在使用 PHP 进行编程时&#xff0c;有时需要对数组进行排序&#xff0c;通常我们使用的对数组进行排序的方法有冒泡排序、快速排序等等。我们除了可以自定义一些数组排序的函数外&#xff0c;PHP 还内置了多种对数组进行排序的函数&#xff0c;这些函数允许用户在数组内部对元素…

介绍并扩展Fitnesse的测试模块化机制:Scenario

2019独角兽企业重金招聘Python工程师标准>>> 首先普及一下概念&#xff0c;什么是Fitnesse&#xff0c;听一听.NET版Cucumber的创始人Aslak Hellesy谈Fitnesse与Cucumber对比&#xff1a; FIT/Fitnesse和Cucumber都执行高级语言编写的验收测试。FIT仅识别HTML&#…

cmake, This may result in binaries being created in the wrong place

现象&#xff1a; CMake Error: The current CMakeCache.txt directory /home/etouch/minigui-64/minigui/libmgeff-1.0.0/CMakeCache.txt is different than the directory /home/weiym/devel/minigui/rel-3-0/libmgeff-1.0 where CMakeCache.txt was created. This may resul…

GDB调试技巧

1. GDB 调试程序 1.Run a program without any argument. gdb program 2. Run a program with arguments gdb --args program arg1 arg2 ... argN or gdb program (gdb) r arg1 arg2 ... argN 3. start with both an executable program and a core file specified gdb…

php 进程管理,php如何管理进程

进程管理-防止进程成为僵尸进程创建好了进程&#xff0c;那么怎么对子进程进行管理呢&#xff1f;使用信号&#xff0c;对子进程的管理&#xff0c;一般有两种情况&#xff1a;(推荐学习&#xff1a;PHP编程从入门到精通)posix_kill()&#xff1a;此函数并不能顾名思义&#xf…

Linux分区的认识

有时候为了便于管理硬盘或允许在一块硬盘上使用多个文件系统或操作系统&#xff0c;需要对硬盘进行分区操作。硬盘的分区分为3种&#xff1a;主分区、扩展分区、逻辑分区。通常因为计算机BIOS和MBR的限制&#xff0c;一块硬盘最多只能有4个分区&#xff0c;其中一个主分区可用扩…

求小数的小数点的第n位是什么

链接&#xff1a;https://ac.nowcoder.com/acm/contest/548/B来源&#xff1a;牛客网 时间限制&#xff1a;C/C 1秒&#xff0c;其他语言2秒空间限制&#xff1a;C/C 262144K&#xff0c;其他语言524288K64bit IO Format: %lld题目描述 立华奏在学习初中数学的时候遇到了这样一…

Git 简介1-常用术语

常用术语 1. origin origin是对项目最初克隆(clone)的远程仓库的缩写。 更准确地说&#xff0c;origin 是用来代替原始(original)远程仓库的URL, 从而使在git 命令中使用原始仓库更加容易。 2. master master 是分支的命名约定。 从远程服务器克隆后&#xff0c;生成的本…

要过一遍的博客列表

面向GC的Java编程 (finish) java程序员也应该知道的系统知识系列 (finish) 一致性哈希算法及其在分布式系统中的应用(finish) NoSQL数据库的分布式算法 深入理解java内存模型系列文章 转载于:https://www.cnblogs.com/dongxiao-yang/p/4767179.html

b站弹幕 xml php 乱码,B站弹幕Python爬行XML响应中的代码转换问题,python,之,取,b,xml,时,转码...

在学习过程中&#xff0c;可以发现&#xff0c;对于xml类型的响应&#xff0c;了解到的方式lxml和bs解析器。frombs4importBeautifulSoup #主要使用BeautifulSoup类事实上可以认为&#xff1a;HTML文档和标签树&#xff0c;BeautifulSoup类是等价的Beautiful Soup库解析器&…

java.io包和杯子测楼

1 java.io 字符流&#xff1a;Reader 字节流&#xff1a;InputStream 2 杯子测楼 一种杯子&#xff0c;若在第N层被摔破&#xff0c;则在任何比N高的楼层均会破&#xff0c;若在第M层不破&#xff0c;则在任何比M低的楼层均不会破&#xff0c;给你两个这样的杯子&#xff0c;让…

JUnit测试类完成后事务是默认 回滚的。只能查询数据,不能增删改。

JUnit测试类完成后事务是默认 回滚的。只能查询数据&#xff0c;不能增删改。 在测试类或者测试方法上面加上注解 Rollback(false) 表示事物不回滚&#xff0c;这样数据就可以提交到数据库中了。 转载于:https://www.cnblogs.com/zhangcheng1/p/11156389.html

gcc 编译选项

下载gcc文档&#xff0c;第三章有详细的build options的介绍。 最近我用到2个关键的option 来定位问题&#xff0c;简单介绍一下&#xff1a; 1. -E: 只是进行预编译&#xff0c;不会编译和link。用于检查宏在代码中的展开是否符合预期&#xff1b; 2.--verbose: 开启verbos…

ionic中的后退方法

1&#xff09;$ionicHistory.goBack();2&#xff09;$ionicNavBarDelegate.back(); 个人感觉&#xff1a; 1&#xff09;$ionicHistory.goBack()会按照html历史来后退 2&#xff09;$ionicNavBarDelegate.back()会按照ion-nav-view的层级来跳转&#xff1b;但是&#xff0c;调用…

php 生成非对称密钥,php实现非对称加密

使用非对称加密主要是借助openssl的公钥和私钥&#xff0c;用公钥加密私钥解密&#xff0c;或者私钥加密公钥解密。1.安装openssl和PHP的openssl扩展2.生成私钥&#xff1a;openssl genrsa用于生成rsa私钥文件&#xff0c;生成是可以指定私钥长度和密码保护1. openssl genrsa -…

HDU 4951 Multiplication table(2014 Multi-University Training Contest 8)

思路 如果进制为p 那么当x<p时 &#xff08;p-1&#xff09;*&#xff08;p-x&#xff09;(p-&#xff08;x1&#xff09;) *p x 因为x<p 所以没有进位 所以高位上的数字为 p-&#xff08;x1&#xff09;。 根据上面所述。 只要我们能找出 p-1 那么我们…