快速构建Windows 8风格应用25-数据绑定
本篇博文主要介绍如何将UI元素与数据进行绑定、数据绑定的方向、数据更改通知、数据转换、数据绑定支持的绑定方案。
数据绑定是一种简单方式来显示数据,UI元素与数据对象之间的连接或绑定是允许数据在两者之间流动的。另外建立了绑定且数据发生变化时,相应的UI元素会自动显示变化。
如何将UI元素与数据进行绑定
从上面图可以知道,每个绑定必须指定一个源和一个目标。
其中源对象可以是任何CLR对象,包括目标元素自身和其他UI元素。目标可以是FrameworkElement的任何DependencyProperty(依赖属性)。
数据绑定引擎从Binding对象获取以下内容:
1)源对象和目标对象;
2)数据流的方向;
3)值转换器;
例如:使用C#代码和XAML将TextBox的Foreground属性进行绑定。
XAML代码:
<TextBox x:Name="MyTextBox" Text="Text" Foreground="{Binding Brush1, Mode=OneWay}"/>
C#代码:
MyColors textcolor = new MyColors();
textcolor.Brush1 = new SolidColorBrush(Colors.Red);
MyTextBox.DataContext = textcolor;
绑定是使用{Binding…}语法在XAML中创建的。源是通过设置TextBox的DataContent属性在代码中设置的。
另外数据是会被继承的。若我们在某个父元素上设置数据上下文,那么其子元素将使用同一数据。我们可以通过设置Binding.Path属性绑定到源对象的某个属性。
数据绑定的方向
每一个绑定都包含一个Mode属性,用于确定数据流动的方式和时间。
三种类型的绑定:
1)OneTime:绑定会在创建时使用源数据更新目标。
2)OneWay:绑定会在创建时以及数据发生更改时使用源数据更新目标(默认模式)。
3)TwoWay:绑定会在目标和源中的任一个发生更改时同时更新目标和源。
数据更改通知
当源数据对象进行了更改,如何将新的源数据对象传递给目标对象呢?解决办法是源数据对象继承INotifyPropertyChanged 接口。因为INotifyPropertyChanged 接口提供了PropertyChanged 事件,该事件会告诉数据绑定引擎,源对象已经改变,方便更改目标值。
例如:
// Create a class that implements INotifyPropertyChanged.
public class MyColors : INotifyPropertyChanged
{
private SolidColorBrush _Brush1;
// Declare the PropertyChanged event.
public event PropertyChangedEventHandler PropertyChanged;
// Create the property that will be the source of the binding.
public SolidColorBrush Brush1
{
get { return _Brush1; }
set
{
_Brush1 = value;
// Call NotifyPropertyChanged when the source property
// is updated.
NotifyPropertyChanged("Brush1");
}
}
// NotifyPropertyChanged will raise the PropertyChanged event,
// passing the source property that is being updated.
public void NotifyPropertyChanged(string propertyName)
{
if (PropertyChanged != null)
{
PropertyChanged(this,
new PropertyChangedEventArgs(propertyName));
}
}
}
示例代码中MyColors类继承了INotifyPropertyChanged 接口,当Brush1属性更改时将触发PropertyChanged事件通知目标对象以及更改。
数据转换
当我们存储的数据在UI界面显示的时候,对用户来讲不友好时,可以将数据进行相应的转换进行显示。这时我们就需要一个数据的转换器了。
我们可以在任意的绑定上设置转换器,并且自定义转换器类必须继承实现IValueConverter 接口。
例如:
// Custom class implements the IValueConverter interface.
public class DateToStringConverter : IValueConverter
{
#region IValueConverter Members
// Define the Convert method to change a DateTime object to
// a month string.
public object Convert(object value, Type targetType,
object parameter, string language)
{
// value is the data from the source object.
DateTime thisdate = (DateTime)value;
int monthnum = thisdate.Month;
string month;
switch (monthnum)
{
case 1:
month = "January";
break;
case 2:
month = "February";
break;
default:
month = "Month not found";
break;
}
// Return the value to pass to the target.
return month;
}
// ConvertBack is not implemented for a OneWay binding.
public object ConvertBack(object value, Type targetType,
object parameter, string language)
{
throw new NotImplementedException();
}
#endregion
}
当从源对象传递数据时,绑定引擎会调用Convert 并将返回的数据传递回目标。
当从目标传递数据时,绑定引擎会调用ConvertBack 并将返回的数据传递回源。
XAML代码中设置Converter:
<UserControl.Resources>
<local:DateToStringConverter x:Key="Converter1"/>
</UserControl.Resources>
...
<TextBlock Grid.Column="0"
Text="{Binding Month, Converter={StaticResource Converter1}}"/>
转换器中还有两个可选参数:ConverterLanguage(该参数允许指定在转换中使用的语言)和 ConverterParameter(该参数允许为转换逻辑传递一个参数)。
注意:若在数据转换中存在错误,最好不要抛出异常,而是返回DependencyProperty.UnsetValue,它将停止数据传输。
支持的绑定方案
方案 | C# |
绑定到对象 | 可以为任何对象 |
从绑定对象中获取属性更改更新 | 数据对象必须实现INotifyPropertyChanged接口 |
绑定到集合 | 使用List(Of T) |
从绑定集合中获取集合更改更新 | 使用ObservableCollection(Of T) |
实现支持绑定的集合 | 扩展 List(Of T) 或实现 IList、IList(属于 Object)、IEnumerable 或 IEnumerable(属于 Object)。绑定到通用 IList(Of T) 和 IEnumerable(Of T) 的操作不受支持 |
实现支持集合更改更新的集合 | 扩展ObservableCollection(Of T) 或实现(非通用)IList 和 INotifyCollectionChanged |
实现支持增量加载的集合 | 扩展 ObservableCollection(Of T) 或实现(非通用)IList 和 INotifyCollectionChanged。此外,还实现ISupportIncrementalLoading |
注:该表格根据MSDN提供的文档进行相应的整理。
更多关于数据绑定的文章可参考:
1.数据绑定概述;
2.快速入门:到控件的数据绑定;
3.如何绑定到分层数据并创建主视图/详细信息视图;
快速构建Windows 8风格应用25-数据绑定相关推荐
- 快速构建Windows 8风格应用6-GridView数据控件
原文:快速构建Windows 8风格应用6-GridView数据控件 本篇博文主要介绍什么是GridView数据控件.如何构建常用的GridView数据呈现样式. 什么是GridView数据控件? G ...
- 《快速构建Windows 8风格应用》系列文章汇总
<快速构建Windows 8风格应用>系列的文章基于XAML+C#进行编写,汇总了Windows 8 Store应用开发过程中常用的开发技术点. 对于我个人来说,将自己平时学习和开发过程中 ...
- 快速构建Windows 8风格应用13-SearchContract构建
本篇博文主要介绍如何在应用中构建SearchContract,相应的原理已经在博文<快速构建Windows 8风格应用12-SearchContract概述及原理>中阐述清楚. 如何在应用 ...
- 快速构建Windows 8风格应用22-MessageDialog
快速构建Windows 8风格应用22-MessageDialog 原文:快速构建Windows 8风格应用22-MessageDialog 本篇博文主要介绍MessageDialog概述.Messa ...
- 快速构建Windows 8风格应用33-构建锁屏提醒
快速构建Windows 8风格应用33-构建锁屏提醒 原文:快速构建Windows 8风格应用33-构建锁屏提醒 引言 Windows Phone(8&7.5)和Windows 8引入了锁屏概 ...
- 快速构建Windows 8风格应用32-构建辅助磁贴
引言 Windows Phone中,我们开发者可能会开发的一个功能点是将数据列表中某一项"Pin To Start(固定到开始屏幕)",大家都知道这种固定到开始屏幕的磁贴叫做辅助磁 ...
- 快速构建Windows 8风格应用27-漫游应用数据
本篇博文主要介绍漫游应用数据概览.如何构建漫游应用数据.构建漫游应用数据最佳实践. 漫游应用数据概览 1.若应用当中使用了漫游应用数据,用户可以很轻松的在不同的设备间保持应用数据的同步. 2.Wind ...
- 快速构建Windows 8风格应用14-ShareContract概述及原理
本篇博文主要介绍Share Contract概述.Share Contract实现原理.实现Share Contract意义. Share Contract概述 我们都知道Windows 8中包含3类 ...
- 快速构建Windows 8风格应用34-构建Toast通知
引言 开发过WindowsPhone应用或者使用过WindowsPhone手机的开发者都知道,我们会收到一些应用的提示信息,这些提示信息出现在手机的上端,并且停留几秒钟后会自动消失,当然如果我们点击弹 ...
- 快速构建Windows 8风格应用15-ShareContract构建
本篇博文主要介绍共享数据包.如何构建共享源.如何构建共享目标.DataTransferManager类. 共享数据包 DataPackage(数据包)是共享数据标准. 共享数据格式可以是多种的,包括文 ...
最新文章
- windows 安装python-pcl 测试ok
- PyQt5 技术篇-通过参数控制Dialog窗口增加?问号按钮
- SAP中差异的一些概念
- PHP对象的内存模型
- 信息学奥赛一本通 1315:【例4.5】集合的划分
- python网页部署-想用python3做web开发的一些不知(主要是环境部署),求解!
- 联网智能设备安全态势季度报告(2021年第2季度)
- Java中NLP的学习
- 一道求因子之和面试算法题
- vue结合vue-amap调用高德地图行政区划分
- 任正非自称不如钱伯斯!钱伯斯究竟是何许人?
- 草蛋的Android studio 居然让我搞了好几天 真是智障啊non-zero exit value 2
- 黑白和彩色CCD摄像机成像原理简介
- AppScan安全扫描问题解决方案
- python脚本批量修改图片像素大小和重命名
- 安装centos7.0时电脑进入黑屏的解决方法
- 记录《时间进度》(人生进度条)(包含自定义进度、小插件)的开发
- js处理blur事件触发多次
- 千里之行,始于足下——有感于平安林伟丹的分享
- 实现微信向多好友定时发送信息
热门文章
- PAIP.vs2010打开某个FORM窗体设计视图时崩溃时
- VS2015 C#6.0 中的那些新特性(转)
- 业务中台实践助力企业数字化转型
- RocketMQ助力编程猫构建稳定的业务系统 | 凌云时刻
- 与生命赛跑,Serverless提升AI诊断效率90% | 凌云时刻
- Kafka从上手到实践 - 初步认知:MQ系统 | 凌云时刻
- 【路径规划】基于matlab麻雀算法求解机器人栅格地图最短路径规划问题【含Matlab源码 1582期】
- 【MTSP】基于matlab遗传算法求解多旅行商问题【含Matlab源码 1338期】
- 【图像隐写】基于matlab GUI DCT数字水印嵌入与提取【含Matlab源码 943期】
- 数据类型选方法【SPSS 073期】