zoukankan      html  css  js  c++  java
  • 构建基于WinRT的WP8.1 App 02:数据绑定新特性

    基于WinRT的Windows Phone 8.1以及Windows 8.1中Xaml数据绑定增加了一些新特性。

    FallBackValue属性:FallBackValue在绑定的值属性值不存在时,可以指定一个代替的属性和值显示。

       1:  <TextBlock Text="{Binding Path=badPath, 
       2:             FallbackValue='this is a fallback value'}"     
       3:             Grid.Column="1"> </TextBlock>

    上述代码中设置了FallbackValue属性,也就说当badParh属性值不存在(无返回值)时,将使用“this is a fallback value”文本进行替代显示。

    关于FallBackValue属性的详细解释可参考MSDN:

    http://msdn.microsoft.com/zh-cn/library/windows/apps/xaml/windows.ui.xaml.data.binding.fallbackvalue.aspx

    TargetNullValue属性:TargetNullValue在绑定的属性值返回Null时可以指定一个代替的属性或值显示。

       1:  <Button Content="{Binding Path=NextItem, Mode=OneWay, 
       2:  TargetNullValue={Binding Path=NullValue}}" />

    上述代码中设置了TargetNullValue属性值,也就是说当Button.Content属性绑定的NextItem值为Null,使用NullValue属性值进行显示。

    关于TargetNullValue属性的详细解释可参考MSDN:

    http://msdn.microsoft.com/zh-cn/library/windows/apps/xaml/windows.ui.xaml.data.binding.targetnullvalue.aspx

    UpdateSourceTrigger属性:通过设置UpdateSourceTrigger属性值,确定双向绑定的绑定的源更新的执行时间。

    其实UpdateSourceTrigger属性早已经出现在WPF和Silverlight中,而Windows Phone 8.1和Windows 8.1中Xaml才引入该属性。

       1:  <TextBox x:Name="NameTxtBox1" Text="{Binding Name, Mode=TwoWay, UpdateSourceTrigger=Default}" Width="200" HorizontalAlignment="Left" Grid.Column="1" Grid.Row="1"/>
       2:  <TextBox x:Name="NameTxtBox" Text="{Binding Name, Mode=TwoWay, UpdateSourceTrigger=Explicit}" Width="200" Grid.Row="2" HorizontalAlignment="Left" Grid.Column="1"/>
       3:  <TextBox x:Name="NameTxtBox3" Text="{Binding Name, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Width="200" Grid.Row="3" HorizontalAlignment="Left" Grid.Column="1"/>

    从上述代码中看到,UpdateSourceTrigger包含3个枚举值。

    Default:使用依赖项属性(该属性使用绑定)中的默认行为。在WinRT运行时,实现数据绑定更新的效果等同于PropertyChanged。

    PropertyChanged:每当绑定目标值改变时,就会更新绑定源。这由绑定系统自动检测。

    Explicit:仅在调用BindingExpression.UpdateSource方法时更新绑定源。

    通俗点理解就是,当UpdateSourceTrigger属性值设置为Default或者PropertyChanged时,当更新目标属性值时,数据源会马上进行更新,而设置为Explicit时,需要使用GetBindingExpression方法从某个对象获取BindingExpression,在该对象中存在依赖属性的Binding,然后调用获取的BindingExpression对象的UpdateSource方法更新数据源,代码可以参考如下:

       1:   var expression = NameTxtBox.GetBindingExpression(TextBox.TextProperty);
       2:   expression.UpdateSource();

    关于UpdateSourceTrigger属性的详细解释可参考MSDN:

    http://msdn.microsoft.com/zh-cn/library/windows/apps/xaml/windows.ui.xaml.data.binding.updatesourcetrigger.aspx

    另外关于继承INotifyPropertyChanged的ViewModel中具有属性通知的属性写法,可利用C#5.0中新特性进行优化。

    未优化的ViewModel实现方式:

    image

    注意红色框,如果有一天项目中ID属性名称发生了更改,其实有很大几率会把NotifyPropertyChanged(“ID”)中”ID“文本忘记更新,这样就会导致无法实现双向绑定的属性值更改通知。

    因此我们可以将上述代码进行优化:

    image

    上述代码中,优化主要通过CallerMemberName特性实现。CallerMemberName是C#5.0中引入的调用方信息其中一个特性,通过调用方信息可以方便的获取调用方的函数名称和位置。

    关于调用方信息详细解释可参考MSDN:

    http://msdn.microsoft.com/zh-cn/library/vstudio/hh534540(v=vs.110).aspx

  • 相关阅读:
    iOS----------弹窗动画
    书单
    如何屏蔽垃圾短信
    2018年IOS/Android UI设计规范
    关于Keychain
    OpenUDID 和 IDFA 比较
    iOS-----------关于UDID
    iOS-----------设置自定义字体
    【2020Python修炼记】前端开发之 JavaScript 基础
    【2020Python修炼记】前端开发之 CSS基础布局
  • 原文地址:https://www.cnblogs.com/wzk89/p/3957866.html
Copyright © 2011-2022 走看看