三、绑定模式

通过上一文章中的示例,学习了简单的绑定方式。在这里的示例,要学习一下绑定的模式,和模式的使用效果。

首先,我们来做一个简单示例,这个示例是根据ListBox中的选中项,去改变TextBlock的背景色。将 TextBlock 的背景色绑定到在 ListBox 中选择的颜色。在下面的代码中针对TextBlock的 Background 属性使用绑定语法绑定从 ListBox 中选择的值。代码如下。

 <StackPanel Grid.Row="1"><TextBlock Width="248" Height="24" Text="颜色:"TextWrapping="Wrap"/><ListBox x:Name="listColor" Width="248" Height="56"><ListBoxItem Content="Blue"/><ListBoxItem Content="Red"/><ListBoxItem Content="Green"/><ListBoxItem Content="Gray"/><ListBoxItem Content="Cyan"/><ListBoxItem Content="GreenYellow"/><ListBoxItem Content="Orange"/></ListBox><TextBlock Width="248" Height="24" Text="改变背景色:" /><TextBlock Width="248" Height="24" Background="{Binding ElementName=listColor, Path=SelectedItem.Content, Mode=OneWay}"></TextBlock></StackPanel>

如果用户在 ListBox 中选择了一种颜色,那么TextBlock 的背景色会变为选定的颜色(如下图1)。

图1

接下来我们对上面的示例进行一些修改:

1)  同一个数据源绑定到两个或多个控件上。如我们的示例中把ListBox的选中项绑定到TextBox与TextBlock。

2)  在绑定语法中增加一个 Mode 属性,即绑定模式。对于我们的示例,我们把TextBlock的绑定语法中的Mode属性设为 OneWay 。把TextBox的绑定语法中的Mode属性设为TwoWay。

对于示例中的Mode进行一下简单说明(具体可以参见前一篇):

1)使用 OneWay 绑定时,每当数据源(ListBox)发生变化时,数据就会从数据源流向目标(TextBlock)。

2)OneTime 绑定也会将数据从源发送到目标;但是,仅当启动了应用程序或 DataContext 发生更改时才会如此操作,因此,它不会侦听源中的更改通知。

3)OneWayToSource 绑定会将数据从目标发送到源。

4)TwoWay 绑定会将源数据发送到目标,但如果目标属性的值发生变化,则会将它们发回给源。

下面就是修改后的示例代码,功能是将 TextBlock (OneWay) 和 TextBox (TwoWay) 绑定到 ListBox 的代码:

 <StackPanel Grid.Row="1"><TextBlock Width="248" Height="24" Text="颜色:"TextWrapping="Wrap"/><ListBox x:Name="listColor" Width="248" Height="56"><ListBoxItem Content="Blue"/><ListBoxItem Content="Red"/><ListBoxItem Content="Green"/><ListBoxItem Content="Gray"/><ListBoxItem Content="Cyan"/><ListBoxItem Content="GreenYellow"/><ListBoxItem Content="Orange"/></ListBox><TextBlock Width="248" Height="24" Text="改变背景色:" /><TextBlock Width="248" Height="24" Text="{Binding ElementName=listColor, Path=SelectedItem.Content, Mode=OneWay}"Background="{Binding ElementName=listColor, Path=SelectedItem.Content, Mode=OneWay}"></TextBlock><TextBox Name="txtTwoWay" Text="{Binding ElementName=listColor,Path=SelectedItem.Content,Mode=TwoWay}"Background="{Binding ElementName=listColor,Path=SelectedItem.Content,Mode=TwoWay}"></TextBox></StackPanel>

图 2

在上述示例中,对TextBlock使用了 OneWay 绑定模式,因为我希望只有当选择了 ListBox 中的某一项之后,应用程序将选定的 ListBoxItem(数据源)发送到 TextBlock。我不希望 TextBlock 的变更会影响到 ListBox中的内容。

我对TextBox使用 TwoWay 绑定模式,因为我希望用户在 ListBox 中选择一种颜色后,该颜色就会显示在 TextBox 中,并且其背景色也会随之相应变化。如果该用户在 TextBox 中键入了一种颜色(例如Pink),ListBox 中刚才选中的颜色名称就会被更新(即从目标到数据源),当鼠标再次点击这条修改后的数据时,新值就会被再次发送到TextBox上。这意味着 TextBlock 也会随之改变。(请参见图 2)。

如果我将 TwoWay 模式改回到 OneWay,用户则可以编辑 TextBox 中的颜色,但是不会将TextBox中输入的值去替换ListBox中选中项的值。

绑定模式如何应用呢?下面是个人的一点见解:

1)当只想让用户看到数据,而不希望用户去修改数据时,可以采用 OneWay 模式,类似winform中的只读属性。

2)当希望用户可以对控件中的数据进行修改,同时让用户修改的数据更新到数据源(DataSet、对象、XML 或其他绑定控件)中时,可以使用 TwoWay 绑定。

3)如果想让用户修改数据源中的数据,而又不想使用TowWay模式,就可以使用 OneWayToSource 绑定。OneWayToSource模式允许通过在原来被看作是绑定源的对象中放置绑定表达式,从而翻转源和目标。

4)当你的界面中的一系列只读控件均被绑定了数据,并且当用户刷新了数据源时,希望绑定控件中的值仍保持不变,可以使用 OneTime 绑定。此外,当源没有实现 INotifyPropertyChanged 时,OneTime 绑定模式也是一个不错的选择。

说明:绑定目标中的修改何时去修改数据源

在上面的例子中,TextBox 使用了 TwoWay 绑定模式,所以当TextBox 失去焦点时WPF会使用TextBox中的值改变ListBox中的值。如果你不想在TextBox失去焦点时,就去修改ListBox中的值,可以为 UpdateSourceTrigger 指定值,它是用于定义何时更新源的绑定属性。可以为 UpdateSourceTrigger 设置三个值:Explicit、LostFocus 和 PropertyChanged。

如果将 UpdateSourceTrigger 设置为 Explicit,则不会更新源,除非从代码中调用 BindingExpression.UpdateSource 方法。设置为LostFocus ,(TextBox 控件的默认值)指示数据源绑定的控件失去焦点时才会更新。PropertyChanged 值绑定控件的绑定属性每次发生更改时就去更新数据源中的值。

WPF入门教程系列十六——WPF中的数据绑定(二)相关推荐

  1. WPF入门教程系列十五——WPF中的数据绑定(一)

    使用Windows Presentation Foundation (WPF) 可以很方便的设计出强大的用户界面,同时 WPF提供了数据绑定功能.WPF的数据绑定跟Winform与ASP.NET中的数 ...

  2. WPF入门教程系列十四——依赖属性(四)

    六.依赖属性回调.验证及强制值 我们通过下面的这幅图,简单介绍一下WPF属性系统对依赖属性操作的基本步骤: 借用一个常见的图例,介绍一下WPF属性系统对依赖属性操作的基本步骤: 第一步,确定Base ...

  3. WPF入门教程系列十九——ListView示例(一)

    经过前面的学习,今天我做一个比较综合的WPF程序示例,主要包括以下功能: 1) 查询功能.从数据库(本地数据库(local)/Test中的S_City表中读取城市信息数据,然后展示到WPF的Windo ...

  4. WPF入门教程系列三——Application介绍(续)

    接上文WPF入门教程系列二--Application介绍,我们继续来学习Application 三.WPF应用程序的关闭 WPF应用程序的关闭只有在应用程序的 Shutdown 方法被调用时,应用程序 ...

  5. WPF入门教程系列四——Dispatcher介绍

    WPF入门教程系列四--Dispatcher介绍 一.Dispatcher介绍 微软在WPF引入了Dispatcher,那么这个Dispatcher的主要作用是什么呢? 不管是WinForm应用程序还 ...

  6. 生日祝福小程序_广告配音剪映零基础入门教程第二十六篇:如何给朋友制作生日祝福视频...

    经常听到小伙伴问到生日祝福视频怎么做,当然我想既然要为他人做生日祝福视频,那么这个人必定是自己身边比较重要的人,而生日又是每个人都是非常重要的,在这种充满意义的时刻,我们想给自己极其重要的人送上一份祝 ...

  7. WPF入门教程系列(二) 深入剖析WPF Binding的使用方法

    同一个对象(特指System.Windows.DependencyObject的子类)的同一种属性(特指DependencyProperty)只能拥有一个binding. 这一点可以通过设置bindi ...

  8. ionic入门教程第十六课-在微信中使用ionic的解决方案(按需加载加强版)

    对于微信端来说,其实使用ionic是一个比较大的前端框架. 有更多比较轻量化的前端框架可以选择. 但是使用ionic有一个明显的优点就是,能够做到一端开发,三端同步上线. 这个梗说了好多遍了,但确实是 ...

  9. Android入门教程四十六之ViewFlipper(翻转视图)的基本使用

    本节给大家带了的是ViewFlipper,它是Android自带的一个多页面管理控件,且可以自动播放! 和ViewPager不同,ViewPager是一页页的,而ViewFlipper则是一层层的,和 ...

最新文章

  1. 【微信小程序】登录功能实现及讲解(获取用户唯一标识)
  2. sql语句中having的作用是?
  3. Python中metaclass解释
  4. LoadRunner学习第四天——检查点学习(转载)
  5. BZOJ4855 : [Jsoi2016]轻重路径
  6. 【slighttpd】基于lighttpd架构的Server项目实战(2)—预备知识之libevent
  7. java ajax 导入excel_Ajax asp.net 导入Excel
  8. SpringBoot 自定义线程池
  9. python模块名不规范如何导入_如何强制Python的“导入”将名称视为模块,而不是函数?...
  10. mysql 添加表索引_如何向MySQL表中添加索引?
  11. hzwap u.php_『THINKPHP』U 函数
  12. 003、使用MegaCli工具查看Raid磁盘阵列状态
  13. Error executing DDL
  14. 几家大厂求职与面试(一):Java必备,不看就是遗憾
  15. 科技驰援 攻坚战疫 | 用友助力武汉协和医院部署捐赠物资管理系统,保证“物尽其用”...
  16. aws认证,aws有哪些认证,有什么用
  17. C语言 打飞机 小游戏
  18. 时间序列分析-----1---简介
  19. C++头文件---algorithm
  20. 小伙利用Python绘制999种玫瑰花表白女神,会编程男孩子真好

热门文章

  1. python分析nginx日志_利用python分析nginx日志
  2. java工具类,常用的那些方法
  3. C++的三种封装层级
  4. java后台代码添加超链接_Java 添加超链接至Excel文档
  5. 大学计算机学情分析,大学生学情分析
  6. github不支持html,为什么Github页面不允许我有效的HTML?
  7. python怎么通过占位符_如何输入占位符?
  8. java ssm框架做增删改查,使用SSM框架组合实现增删改查的功能
  9. vue2.0桌面端框架_Vue PC端框架
  10. java 上传文件到服务器_java上传文件到OSS云服务器(二)