[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#代码就能出色的完成绑定任务!

  好了,强迫症犯了。之几种情形见下一篇博文。

原文地址:https://www.cnblogs.com/cjw1115/p/4888348.html