UWP基础教程 - {x:Bind}

在Windows10 UWP开发中,新增了{x:Bind}扩展标记,这个标记和Android DataBinding原理非常像,大家有兴趣可以点链接进去看下。 {x:Bind} 和 {Binding} 使用方法类似,但是比{Binding}调试方便,性能上更优,在使用上不需要设置DataContext,而是从Page(或者UserControl)来寻找属性进行绑定。可能是为了强调性能,{x:Bind}的默认绑定Mode是OneTime,而不是OneWay,在使用的时候记得根据需要进行修改。 下面我们来看下{x:Bind}的使用例子

<Page
    x:Class="XBind.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:XBind"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d">

    <Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
        <TextBlock Text="{x:Bind ShowTitle}"></TextBlock>
    </Grid>
</Page>
  public sealed partial class MainPage : Page
    {
        public string ShowTitle { get; set; }

        public MainPage()
        {
            this.InitializeComponent();
            this.ShowTitle = "陈仁松{x:Bind}测试";
        }
    }

上面的例子以Page作为绑定的默认源,当然你也可以定义ViewModel作为你的数据源,这里就不演示了,为什么说{x:Bind}性能会比{Binding}好呢?原因其实是{x:Bind}会在编译时生成一系列的代码,而{Binding}是在运行时才执行的,性能当然有所不同。

private void Update_ShowTitle(global::System.String obj, int phase)
{
    if((phase & ((1 << 0) | NOT_PHASED )) != 0)
    {
        XamlBindingSetters.Set_Windows_UI_Xaml_Controls_TextBlock_Text(this.obj2, obj, null);
    }
}
public static void Set_Windows_UI_Xaml_Controls_TextBlock_Text(global::Windows.UI.Xaml.Controls.TextBlock obj, global::System.String value, string targetNullValue)
{
    if (value == null && targetNullValue != null)
    {
        value = targetNullValue;
    }
        obj.Text = value ?? global::System.String.Empty;
}

上面代码就是自动生成的,位于obj目录下的Page.g.cs,有兴趣的同学可以去试试不同的{x:Bind}语法会生成怎么样的代码,有助于你对{x:Bind}的学习。

在使用{x:Bind}有一点需要注意的,在DataTemplate中使用,必须要显示表明绑定的数据类型

   <ListView ItemsSource="{x:Bind List}">
            <ListView.ItemTemplate>
                <DataTemplate x:DataType="local:Student">
                    <TextBlock Text="{x:Bind Name}"></TextBlock>
                </DataTemplate>
            </ListView.ItemTemplate>
        </ListView>

这个也能理解,因为编译器要识别{x:Bind}的类型,作为自动生成代码的需要,由于先天的局限性,也导致{x:Bind}有很多不能实现的场景:

1、不支持使用C# Code创建 2、不支持UpdateSourceTrigger和Source,要使用UpdateSourceTrigger和Source的话还是乖乖使用Binding Text="{Binding Text,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged} Visibility="{Binding Model.IsShow,Source={StaticResource Locator} 3、不支持写到ResouceDirectory里

目前为止{x:Bind}还不能完全替代{Binding},在项目中还是根据实际情况结合来用。