[uwp开发]数据绑定那些事(1)
现在是msp候选人,是时候写点技术博客来加分了(实则是个人的心得体会)。
注:以下都是个人理解,错误在所难免,欢迎批评指正
以前接触过WPF,只会简单的一些操作,现在在逐渐学习UWP(Universal Windows Platform)开发,当然也接触过WP8.1的开发。总之他们都挺像的,直观感受就是:XAML+CS(当然c++,vb之类的也行)。在这之中有个非常厉害的技术——数据绑定(DataBind)。既然是绑定,就是在两(多)个对象之间,按照某种规则,建立起来一种联系,联系的内容就是数据。
学习数据绑定先大概了解两个概念:
1.数据源:提供数据的地儿
2.绑定目标:接受绑定的对象
现在把常用情形分类指出:
一.两个控件之间的绑定:
最常用的例子,把一个文本框的内容显示(或者实时显示)在一个标签中,又或者通过一复选框来控制一个控件的可见性(Visibility),这儿还会引出一个值转换器(Converter)的概念.
下面就针对这两种实际情况给出示例代码。
DEMO1:把一个文本框的内容显示(或者实时显示)在一个标签中,
<TextBox x:Name="tbInput"></TextBox>
<TextBlock x:Name="tbOutput" Text="{Binding ElementName=tbInput,Path=Text,Mode=OneWay }"></TextBlock>
这种绑定只需要在XAML中设置绑定关系即可。简单易用。
分析一下:第一个TextBox是数据源,TextBlock是绑定目标,因为我们是把TextBox的Text属性绑定到TextBlock的Text属性上,所以需要在TextBlock的Text属性上设置绑定,
语法如上面代码第二行所示,
ElementName:数据源的名称(Name属性)
Path:指明数据源的具体属性
Mode:是一个枚举值,有OneTime,OneWay,TwoWay三种方式,分别表示绑定一次,单向绑定,双向绑定。其中单向是指绑定目标的数据受数据源影响,但不影响数据源;
双向是指数据源和绑定目标互相影响,其中一个变了,另一个也跟着变。
DEOM2:通过一复选框来控制一个控件的可见性(Visibility)
<Page.Resources>
<local:DataConverter x:Key="converter"></local:DataConverter>
</Page.Resources>
<CheckBox x:Name="cbState" IsChecked="True"></CheckBox>
<TextBlock x:Name="tbInfo" Visibility="{Binding Path=IsChecked,ElementName=cbState, Mode=OneWay,Converter={StaticResource ResourceKey=converter}}">你能看见我吗</TextBlock>
值转换器代码:
public class DataConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, string language)
{
bool? ischeched = value as bool?;
if (ischeched == null || ischeched == false)
{
return Visibility.Collapsed;
}
else
{
return Visibility.Visible;
}
} public object ConvertBack(object value, Type targetType, object parameter, string language)
{
throw new NotImplementedException();
}
}
这第二个实例的代码看着有些烦,但是仔细理解还是很简单的。
先来分析一下需求:
当CheckBox的IsChecked属性为True时,TextBlock的Visibilty属性为Visible;
当CheckBox的IsChecked属性为False时,TextBlock的Visibilty属性为Collapsed.
即True对应Visiblle,Flase对应Collapsed,如果按照我们之前Demo1的写法,应该是
Visibility="{Binding Path=IsChecked,ElementName=cbState, Mode=OneWay}"
但是这么写后会发现运行后无效果,因为系统根本就不知道CheckBox的IsChecked属性和TextBlock的Visilibity属性之间有什么对应关系,
而值转换器(ValueConverter)就是提供这种对应关系的东西。
之前的DEMOE1中不需要我们显示指定一个值转换器,因为他们的Text属性都是string类型,类型一致,系统就会自动帮我们完成值转换的工作!
但是我们的Demo2就不行了,系统猜不出来我们到底是怎么完成对应关系的,需要我们自己动手写!
代码如上,我们定义一个类DataConverter,让他继承自IValueConverter,这个接口定义了两个方法
Convert是从数据源到绑定目标的转换;
ConvertBack是从绑定目标到绑定源的转换(在这个demo中我们是单向绑定,所以不需要实现这个接口,让它保持默认情况即可,但是不能吧这个方法删掉,这样编译会报错,原因你应该懂)
在Convert方法中,
value代表需要被转换的值,在我们的这个demo中,他可能为True,False,null
targetType代表最终需要的数据得类型,这个demo中是Visibilty枚举类型!
然后我们在Convert中根据value的类型,返回相应的Visibilty枚举值即可!
综上,Demo1和Demo2都很简单,都是两个系统控件之间的绑定。他们只需要我们手写很少的c#代码就能出色的完成绑定任务!
好了,强迫症犯了。之几种情形见下一篇博文。
[uwp开发]数据绑定那些事(1)的更多相关文章
- [uwp开发]数据绑定那些事(2)
接着上一篇来侃. 二.实体到控件之间的绑定 这儿不知道用实体这个词恰不恰当,凑活着理解就行了.他可以是一个类实例,也可以是一个集合. 所以,相应的我们就引入两个Demo,第一个介绍用简单的类作为作为数 ...
- uwp开发:数据绑定——值转换器 的简单使用
原文:uwp开发:数据绑定--值转换器 的简单使用 今天,我在做最近正在开发的“简影”uwp应用时遇到一个问题,其中有个栏目,叫做“画报”,是分组显示一组一组的 图片,每组图片在界面上只显示9个,点击 ...
- UWP开发小结
做了两天的UWP开发,上手还是挺快的,不过比较郁闷的是总会被一些很简单的细节卡住很久. 首先当然是用C#修改xaml界面这个难点了,Bing搜了好久都没找到相关信息,最后还是老司机伟神指点的我.对于g ...
- Windows 10 UWP开发:如何去掉ListView默认的选中效果
原文:Windows 10 UWP开发:如何去掉ListView默认的选中效果 开发UWP的时候,很多人会碰到一个问题,就是ListView在被数据绑定之后经常有个默认选中的效果,就像这样: 而且它不 ...
- 领域驱动和MVVM应用于UWP开发的一些思考
领域驱动和MVVM应用于UWP开发的一些思考 0x00 起因 有段时间没写博客了,其实最近本来是根据梳理的MSDN上的资料(UWP开发目录整理)有条不紊的进行UWP学习的.学习中有了心得体会或遇到了问 ...
- UWP开发必备:常用数据列表控件汇总比较
今天是想通过实例将UWP开发常用的数据列表做汇总比较,作为以后项目开发参考.UWP开发必备知识点总结请参照[UWP开发必备以及常用知识点总结]. 本次主要讨论以下控件: GridView:用于显示数据 ...
- Win10 UWP开发系列:使用VS2015 Update2+ionic开发第一个Cordova App
安装VS2015 Update2的过程是非常曲折的.还好经过不懈的努力,终于折腾成功了. 如果开发Cordova项目的话,推荐大家用一下ionic这个框架,效果还不错.对于Cordova.PhoneG ...
- UWP开发之控件:用WebView做聊天框
目录 说明 WebView存在的价值 使用WebView的几个重要技巧 使用WebView做的聊天框 说明 大家都知道,无论是之前的Winform.WPF还是现在的IOS.Android开发中,都存在 ...
- Win10 UWP 开发系列:使用SQLite
在App开发过程中,肯定需要有一些数据要存储在本地,简单的配置可以序列化后存成文件,比如LocalSettings的方式,或保存在独立存储中.但如果数据多的话,还是需要本地数据库的支持.在UWP开发中 ...
随机推荐
- WP8__实现ListBox横向滑动及子项绑定图片等控件
<!--实现绑定的图片等信息 ListBox水平滚动--> <Grid> <Grid.Resources> <Style x:Key="horizo ...
- IE6-IE9兼容性问题列表及解决办法总结
IE6-IE9兼容性问题列表及解决办法总结 概述 第一章:HTML. 3 第一节:IE7-IE8更新... 31.如果缺少结束标记的 P 元素后跟 TABLE.FORM.NOFRAMES 或 NOSC ...
- boost::asio 使用实例
#include <iostream> #include <boost/asio.hpp> using namespace std; using namespace boost ...
- 1028 C语言文法
<程序> -> <外部声明> | <程序> <外部声明> <外部声明> -> <函数定义> | &l ...
- hdu2067
如果i==j&&j-1>=0时候,f[i][j]=f[i][j-1]; 如果j==0时候,f[i][j]=1; 其他 f[i][j]=f[i-1][j]+f[i][j-1]; # ...
- MYSQL数据导入导出
在不同操作系统或MySQL版本情况下,直接拷贝文件的方法可能会有不兼容的情况发生.所以一般推荐用SQL脚本形式导入.下面分别介绍两种方法. 进入cmd 导出所有数据库:输入:mysqldump -u ...
- JSON对象遍历方法
JSON对象提前不知道其属性和结构,遍历其值 var json2 = { "name": "txt1", "name2": "tx ...
- 第六章_PHP数组(二)
这篇随笔是对预定义数组变量的总结.通过预定义数组变量,我们可以获得系统环境.用户对话.表单数据等信息. 1.服务器变量:$_SERVER 利用foreach语句打印$_SERVER中的所有元素: &l ...
- android中关闭软键盘
/**隐藏软键盘**/ View view = getWindow().peekDecorView(); if (view != null) { InputMethodManager inputman ...
- 缓存一致性(Cache Coherency)入门
作者: Fabian “ryg” Giesen 来源: infoq 参考原文:http://fgiesen.wordpress.com/2014/07/07/cache-coherency/ 本文是 ...