在Resource中使用x:Bind

Build2015上,MS热情高涨的演示了x:Bind,一种新的Binding方式,新的方式有如下优点:

1更好的性能(内存占用,CPU占用)

2BuildTime的Binding

具体在Channel9有视频

Data Binding: Boost Your Apps‘ Performance Through New Enhancements to XAML Data Binding

新的绑定方式,有如下特点:

x:Bind 主要的几点:

1. 强类型

2.上下文为page 或 UserControl

3.绑定的默认Mode为OneTime

更多了解,请访问:

【Win10】UAP/UWP/通用 开发之 x:Bind

其它的都比较简单,本文主要讲解在Resource中使用x:Bind

1.定义一资源文件DataTemplaterResources.xaml

<ResourceDictionary
    x:Class="SLWeek.CustomTheme.DataTemplaterResources"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:interactivity="using:Microsoft.Xaml.Interactivity"
    xmlns:core="using:Microsoft.Xaml.Interactions.Core"
    xmlns:behaviors="using:MVVMSidekick.Behaviors"
    xmlns:controls="using:Q42.WinRT.Controls"
    xmlns:models="using:SLWeek.Models">
</ResourceDictionary>

注意:要使用x:Class,命名此xmal的部分类,与下面.cs文件从命名空间和类名称上保持一致

2.定义同名的部分类DataTemplaterResources.xaml.cs

namespace SLWeek.CustomTheme
{
  public  partial  class DataTemplaterResources
    {
        public DataTemplaterResources()
        {
            InitializeComponent();
         }
    }
}

注意:一定要在构造函数中使用初如化InitializeComponent();

其结构如下图所示

3.引用资源文件,我们可以在页面引用,也可以直接在APP.xaml中引用,引用方式,不是我们通常的ResourceDictionary,而是如下方式:

  <Application.Resources>
        <ResourceDictionary>
            <ResourceDictionary.ThemeDictionaries>
                <ResourceDictionary x:Key="Light" Source="CustomTheme/ThemeResourcesLight.xaml" />
                <ResourceDictionary x:Key="Dark" Source="CustomTheme/ThemeResourcesDark.xaml" />
            </ResourceDictionary.ThemeDictionaries>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="CustomTheme/CustomStyleResources.xaml" />
                <ResourceDictionary Source="CustomTheme/FlatUIColorsResources.xaml" />
                <theme:DataTemplaterResources/>
            </ResourceDictionary.MergedDictionaries>

        </ResourceDictionary>
    </Application.Resources>

其中theme是为我们为其所有命名空间起的别名

4.我们可以根据业务需要,在Resource中添加自己需要的Datatemplate了

 <DataTemplate x:Key="PostDetailItemDataTemplate" x:DataType="models:PostDetail">
        <Grid  Margin="0,5,0,5" Background="{ThemeResource SystemControlChromeLowBackgroundBrush}">
            <Grid.RowDefinitions>
                <RowDefinition Height="*"/>
                <RowDefinition Height="30"/>
                <RowDefinition Height="40"/>
            </Grid.RowDefinitions>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="80"/>
                <ColumnDefinition Width="*"/>
            </Grid.ColumnDefinitions>
            <interactivity:Interaction.Behaviors>
                <core:EventTriggerBehavior EventName="Tapped">
                    <behaviors:SendToEventRouterAction EventRoutingName="NavToPostDetailByEventRouter"   IsEventFiringToAllBaseClassesChannels="True"  EventData="{Binding}"/>
                </core:EventTriggerBehavior>
            </interactivity:Interaction.Behaviors>
            <Image  controls:ImageExtensions.CacheUri="{x:Bind Icon}" Stretch="Fill" Grid.Row="0" Grid.Column="0" Grid.ColumnSpan="2"/>
            <!--<c:DelayLoadImage DefaultImageSource="../Assets/Icon/no.png"  ActualImageSource="{Binding Icon}" Stretch="Fill" Grid.Row="0" Grid.ColumnSpan="2"/>-->
            <TextBlock Text="{x:Bind Creattime,Converter={StaticResource StringFormatConverter},ConverterParameter=‘{}{0:MMM dd}‘,Mode=OneWay}" FontSize="22" Grid.Row="1" Grid.Column="0" Grid.RowSpan="2" Margin="0,10,0,0"/>
            <TextBlock Text="{x:Bind Title}" FontSize="22" Grid.Row="1" Grid.Column="1" Margin="0,2,0,2"/>
            <TextBlock Text="{x:Bind Des}" TextTrimming="CharacterEllipsis" Style="{StaticResource MenuTitleTextBlockStyle}"  Grid.Row="2" Grid.Column="1"  Margin="0,10" VerticalAlignment="Stretch"/>
        </Grid>
    </DataTemplate>

注意,由于x:Bind是强类型,我们需要在Datatempalte声明中 使有 x:DataType="models:PostDetail" 来确定要绑定的数据类型,

5.在页面中引用这个资源即可

 <ListView  ItemsSource="{x:Bind StrongTypeViewModel.SoureList}"  Style="{StaticResource ListViewWrapItemsPanel}"  ItemTemplate="{StaticResource PostDetailItemDataTemplate}" SizeChanged="ListView_SizeChanged"/>   

最后效果图如下:

时间: 2024-10-22 13:34:55

在Resource中使用x:Bind的相关文章

关于angular的$resource中的isArray属性问题

在之前的文章中讲到了在使用$resource的时候,有一个isArray属性. 这个属性在两个地方有提到: 1. angular学习笔记(二十八)-$http(6)-使用ngResource模块构建RESTful架构 $resource的四个方法: query方法,get方法,save方法,remove方法,delete方法 这四个方法里,唯独query方法,它的isArray属性是true,所以,query接受到的数据是数组,而其余四个方法,接收到的数据必须不能是数组 2. angular学习

javascript中call,apply,bind的用法对比分析

这篇文章主要给大家对比分析了javascript中call,apply,bind三个函数的用法,非常的详细,这里推荐给小伙伴们. 关于call,apply,bind这三个函数的用法,是学习javascript这门语言无法越过的知识点.下边我就来好好总结一下它们三者各自的用法,及常见的应用场景. 首先看call这个函数,可以理解成"借用“,"请求".想像一下如下的情景:你孤单一人漂泊在外,有急事想往家里打电话,可是很不巧,手机欠费了,或者没电了,或者掉坑里了,总之你的手机就是用

C++11中function和bind的用法示例

环境Visual Studio 2012,具体代码如下 #include <iostream> #include <functional> #include <string> void PrintNumber(int num) { std::cout << num << std::endl; } struct Printer { void Print(std::string print_str) { std::cout << prin

angular学习笔记(二十八-附2)-$resource中的promise对象

下面这种promise的用法,我从第一篇$http笔记到$resource笔记中,一直都有用到: HttpREST.factory('cardResource',function($resource){ return $resource('/card/user/:userID/:id',{userID:123,id:'@id'},{charge:{method:'POST',params:{charge:true},isArray:false}}) }); HttpREST.factory('h

angular学习笔记(二十八-附1)-$resource中的资源的方法

通过$resource获取到的资源,或者是通过$resource实例化的资源,资源本身就拥有了一些方法,比如$save,可以直接调用来保存该资源: 比如有一个$resource创建的服务: var service = angular.module('myRecipe.service',['ngResource']); service.factory('Recipe',['$resource',function($resource){ return $resource('/recipe/:id',

Javascript 中apply call bind

在 javascript 中,call 和 apply 都是为了改变某个函数运行时的上下文(context)而存在的,换句话说,就是为了改变函数体内部 this 的指向. 先来一个例子: function fruits() {} fruits.prototype = { color: "red", say: function() { console.log("My color is " + this.color); } } var apple = new fruit

jQuery中绑定事件bind() on() live() one()的异同

jQuery中绑定事件的四种方法,他们可以同时绑定一个或多个事件 bind()-------------------------版本号小于3.0(在Jquery3.0中已经移除,相应unbind()也移除) live()--------------------------版本号小于1.7(在Jquery1.7中已经移除,相应die()也移除) delegate()-------------------版本号小于1.7(在Jquery1.7中已经移除) on()------------------

javascript中apply,call,bind方法

apply,call应该是我们比较熟悉的方法,像Math.max.apply(arr),取数组元素中的最大值,Array.prototype.slice.call(obj)把obj变为数组等方法已经说明了apply及call的使用, 这两者在性能上并无区别,只不过在后面参数上有一定差异,apply的参数是数组形式,而call则是单个元素的形式,譬如我们在网上看到的最常见的add.call(sub,3,1)则是成功调用add方法,得到结果4.当然,call方法也在函数中可以实现类似的多继承问题在网

JavaScript中call,apply,bind方法的总结

why?call,apply,bind干什么的?为什么要学这个? 一般用来指定this的环境,在没有学之前,通常会有这些问题. var a = { user:"追梦子", fn:function(){ console.log(this.user); } } var b = a.fn; b(); //undefined 我们是想打印对象a里面的user却打印出来undefined是怎么回事呢?如果我们直接执行a.fn()是可以的. var a = { user:"追梦子&quo