WP8.1 Study5:Data binding数据绑定
一、数据绑定
最简单的编程UI控件的方法是写自己的数据来获取和设置控件的属性,e.g. , textBox1.Text = "Hello, world"; 但在复杂的应用程序,这样的代码很快就会变得笨拙,容易出错
因此,为了更加方便,使用XAML数据绑定到你的UI链接到一个在应用程序中包含应用程序的数据的类。
- 这个类class:是一个对于被称为视图模型的数据绑定(ViewModel)的数据源。
UI控件可以从视图模型Viewmodel类的属性自动获取其显示值,而且通过改变Viewmodel属性可以更新控件显示。
- 用户的输入可以自动更新视图模型ViewModel类的绑定属性。
1、在xaml中数据绑定Data binding in XAML
如例子:
<TextBlock x:Name="DirectionsTextBlock" TextWrapping="Wrap"
Margin="12,0,0,0" Text="{Binding Directions}" />
在上面的例子中,TextBlock的Text属性绑定到一些数据源的特性。那么我们可以怎样要怎样定义数据源呢?下面是两种方法:
- Datacontext:任何FrameworkElement派生类的DataContext属性(可以直接在控件设置,但通常是设置在一个容器类型的控件,如Grid,或者直接设置在Page上)
- ItemSource:一些列表控件的ItemSource属性。
2、数据绑定模式Data binding modes
如例子:
<TextBlock x:Name="DirectionsTextBlock" TextWrapping="Wrap"
Margin="12,0,0,0" Text="{Binding Directions, Mode=OneWay}" />
模式属性决定改变如何在目标控件和数据源之间的同步
- OneTime--控件属性设置后,数据值之后的任何后续变化都会被忽略
- OneWay--数据对象的变化是可以同步到控件属性,但反之不行
- TwoWay --变化的数据对象是可以同步的控件属性,反之也可以。
3、INotifyPropertyChanged
对象被设置成OneWay或者Twoway绑定必须实现INotifyPropertyChanged接口。
我们可以在ViewModel类中写入如下代码:
public class ItemViewModel : INotifyPropertyChanged
{
private string _id;
/// Sample ViewModel property;
public string ID
{
get { return _id; }
set {
if (value != _id) {
_id = value;
NotifyPropertyChanged("ID"); }
} } public event PropertyChangedEventHandler PropertyChanged;
private void NotifyPropertyChanged(String propertyName)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (null != handler)
handler(this, new PropertyChangedEventArgs(propertyName));
}
}
这种方法还有更好的方法,有兴趣的可以去查阅相关资料。
4、数据绑定到列表Binding to Lists
<ListView x:Name="IngredientsLIstBox" ItemTemplate="{StaticResource MyDataTemplate}" DataContext="{StaticResource RecipeViewModel}"/> ItemsSource="{Binding Ingredients}"/>
在这个例子中,DataContext是RecipeViewModel对象,而ItemsSource绑定到名为Ingredients的对象,它里面是对象的集合。但是,如果你希望当子项目被添加或删除而你的UI能自动更新时,数据源应该是一个ObservableCollection<T>(实现了INotifyCollectionChanged),而且在集合中的项目需要实现INotifyPropertyChanged。就如同:
public class RecipeDetails : INotifyPropertyChanged
{
/// <summary>
/// A collection for ItemViewModel objects.
/// </summary>
public ObservableCollection<ItemViewModel> Items { get; private set; } public void LoadData()
{
this.Items.Add(new ItemViewModel() { ID = "", LineOne = "runtime one", LineTwo = ... });
this.Items.Add(new ItemViewModel() { ID = "", LineOne = "runtime two", LineTwo = ... });
this.Items.Add(new ItemViewModel() { ID = "", LineOne = "runtime three", LineTwo =...});
} ...}
5、数据绑定提高:FallBackValue and TargetNullValue
TargetNullValue允许你当指定数据源的属性返回空时,指定替代属性或值时显示的属性。
<Button Content="{Binding Path=NextItem, Mode=OneWay,
TargetNullValue={Binding Path=NullValue}}" />
FallbackValue允许当你被绑定到属性不存在指定替代属性或值显示。
<TextBlock Text="{Binding Path=badPath,
FallbackValue='this is a fallback value'}"
Grid.Column="1"> </TextBlock>
WP8.1 Study5:Data binding数据绑定的更多相关文章
- Spring Framework 官方文档学习(四)之Validation、Data Binding、Type Conversion(一)
题外话:本篇是对之前那篇的重排版.并拆分成两篇,免得没了看的兴趣. 前言 在Spring Framework官方文档中,这三者是放到一起讲的,但没有解释为什么放到一起.大概是默认了读者都是有相关经验的 ...
- WPF QuickStart系列之数据绑定(Data Binding)
这篇博客将展示WPF DataBinding的内容. 首先看一下WPF Data Binding的概览, Binding Source可以是任意的CLR对象,或者XML文件等,Binding Targ ...
- XAML数据绑定(Data Binding)
XAML数据绑定(Data Binding) Data Binding可以使得XAML标签属性的赋值更为灵活和方便.在绑定过程中,获取数据的标签成为目标标签:提供数据的标签成为源标签.在XAML中 ...
- Android开发教程 - 使用Data Binding(五)数据绑定
本系列目录 使用Data Binding(一)介绍 使用Data Binding(二)集成与配置 使用Data Binding(三)在Activity中的使用 使用Data Binding(四)在Fr ...
- Android Data Binding(数据绑定)用户指南
Android Data Binding(数据绑定)用户指南 http://www.jianshu.com/p/b1df61a4df77 https://github.com/LyndonChin/M ...
- Data Binding MVVM 数据绑定 总结
示例代码:https://github.com/baiqiantao/DataBindingTest 参考:精通Android Data Binding Android Data Binding ...
- WPF中的数据绑定Data Binding使用小结
完整的数据绑定的语法说明可以在这里查看: http://www.nbdtech.com/Free/WpfBinding.pdf MSDN资料: Data Binding: Part 1 http:// ...
- Data Binding(数据绑定)用户指南
1)介绍 这篇文章介绍了如何使用Data Binding库来写声明的layouts文件,并且用最少的代码来绑定你的app逻辑和layouts文件. Data Binding库不仅灵活而且广泛兼容- 它 ...
- Spring中的类型转换与数据绑定(PropertyEditor、ConversionService、Data Binding、Formatter)
Spring早期使用PropertyEditor进行Object与String的转换.到Spring 3后,Spring提供了统一的ConversionService API和强类型的Converte ...
随机推荐
- android设置软键盘搜索键以及监听搜索键点击时发生两次事件的问题解决
在输入框中加入android:imeOptions="actionSearch",调用软键盘时,回车键就会显示搜索二字. 我想在点击搜索时,跳转到下一个页面,但是调用setOnKe ...
- Mysql中的排序规则utf8_unicode_ci、utf8_general_ci的区别总结
Mysql中utf8_general_ci与utf8_unicode_ci有什么区别呢?在编程语言中,通常用unicode对中文字符做处理,防止出现乱码,那么在MySQL里,为什么大家都使用utf8_ ...
- Velocity教程 (zhuan)
http://blog.csdn.net/qq_25237663/article/details/52262532 ****************************************** ...
- smarty 学习记录
smarty模版是比较大众化的一个模版,在php开发过程当中被很多开发者视为最友好的模版之一,学习smarty课程对于很多培训机构来说也是列入了培训课程之一,那么很多方面就需要我们学习了一. 安装首先 ...
- commonJS — DOM操作(for DOM)
for DOM github: https://github.com/laixiangran/commonJS/blob/master/src/forDOM.js 代码 /** * Created b ...
- Hive优化
hive.optimize.cp=true:列裁剪hive.optimize.prunner:分区裁剪hive.limit.optimize.enable=true:优化LIMIT n语句hive.l ...
- java 导入包
导入包 问题:类名冲突时,要如何解决. 解决:sun提供导入包语句让我们解决该问题. 导入包语句的作用:简化书写. 导入包语句的格式:import 包名.类名;(导入xxx包的XX类) 导入包语句的细 ...
- 【bzoj1018】堵塞的交通
[bzoj1018]堵塞的交通 题意 一个\(2*n\)的格子,相邻格子之间有一条道路.初始时道路是不通的. \(C\)个操作,每个操作为三种中的一种:(1)某条道路连起来:(2)某条道路断开:(3) ...
- 八大排序算法的 Python 实现
转载: 八大排序算法的 Python 实现 本文用Python实现了插入排序.希尔排序.冒泡排序.快速排序.直接选择排序.堆排序.归并排序.基数排序. 1.插入排序 描述 插入排序的基本操作就是将一个 ...
- css3中clip属性
clip 属性用来设置元素的形状.用来剪裁绝对定位元素. 当一幅图像的尺寸大于包含它的元素时,"clip" 属性允许规定一个元素的可见尺寸,这样此元素就会被修剪并显示在这个元素中. ...