[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#代码就能出色的完成绑定任务!
好了,强迫症犯了。之几种情形见下一篇博文。