Xamarin XAML语言教程控件模板的模板绑定

控件模板的模板绑定

为了可以轻松更改控件模板中控件上的属性值,可以在控件模板中实现模板绑定功能。模板绑定允许控件模板中的控件将数据绑定到公共属性上。这时需要使用TemplateBinding。它可以将控件模板中的控件的属性绑定到拥有控件模板的目标视图的父级上的可绑定属性上。

注意:(1)TemplateBinding类似于现有的Binding,不同之处在于TemplateBinding的源总是自动设置为拥有控件模板的目标视图的父级。(2)不支持在控件模板之外使用TemplateBinding。

【示例14-5:ControlTemplateDemo】以下将以项目ControlTemplateDemo为基础,在控件模板中实现模板绑定功能。具体的操作步骤如下:

(1)打开MainPage.xaml文件,编写代码,实现可绑定属性的定义。代码如下:

  • namespace ControlTemplateDemo
  • {
  • public partial class MainPage : ContentPage
  • {
  • bool originalTemplate = true;
  • ControlTemplate tealTemplate;
  • ControlTemplate aquaTemplate;
  • public static readonly BindableProperty HeaderTextProperty = BindableProperty.Create("HeaderText",
  • typeof(string),
  • typeof(MainPage),
  • "Knowledge is power.");
  • public static readonly BindableProperty FooterTextProperty = BindableProperty.Create("FooterText",
  • typeof(string),
  • typeof(MainPage),
  • "Xamarin.Froms XAML");
  • public MainPage()
  • {
  • InitializeComponent();
  • ……                        //此处省略了对tealTemplate和aquaTemplate对象的实例化
  • }
  •  public string HeaderText
  •         {
  •             get
  •             {
  •                 return (string)GetValue(HeaderTextProperty);
  •             }
  •         }
  •         public string FooterText
  •         {
  •             get
  •             {
  •                 return (string)GetValue(FooterTextProperty);
  •             }
  •         }
  • ……                                //此处省略了对OnButtonClicked方法的实现
  • }
  • }

(2)打开App.xaml文件,编写代码,在第一个构建的ControlTemplate中实现模板绑定功能。代码如下:

  • <ControlTemplate x:Key="TealTemplate">
  • <Grid>
  • <Grid.RowDefinitions>
  • <RowDefinition Height="0.1*" />
  • <RowDefinition Height="0.8*" />
  • <RowDefinition Height="0.1*" />
  • </Grid.RowDefinitions>
  • <Grid.ColumnDefinitions>
  • <ColumnDefinition Width="0.05*" />
  • <ColumnDefinition Width="0.95*" />
  • </Grid.ColumnDefinitions>
  • <BoxView Grid.ColumnSpan="2"
  • Color="Teal" />
  • <Label Grid.Column="1"
  • Text="{TemplateBinding Parent.HeaderText}"
  • TextColor="White"
  • FontSize="18"
  • VerticalOptions="Center" />
  • <ContentPresenter Grid.Row="1"
  • Grid.ColumnSpan="2" />
  • <BoxView Grid.Row="2"
  • Grid.ColumnSpan="2"
  • Color="Teal" />
  • <Label Grid.Row="2"
  • Grid.Column="1"
  • Text="{TemplateBinding Parent.FooterText}"
  • TextColor="White"
  • FontSize="18"
  • VerticalOptions="Center" />
  • </Grid>
  • </ControlTemplate>

在此代码中,我们将两个Label控件的Text属性实现了模板绑定功能,在上文中我们提到了属性使用模板绑定将其绑定到拥有ControlTemplate的目标视图的父级上的可绑定属性上。但是,在我们的代码中,模板绑定绑定到Parent.HeaderText和Parent.FooterText上,而不是HeaderText和FooterText上。这是因为在此代码中,可绑定属性是在目标视图的祖父级上定义的,而不是父级。

注意:模板绑定的源始终自动设置为拥有控件模板的目标视图的父级,在此项目中是ContentView实例。模板绑定使用Parent属性返回ContentView实例的父元素,这是ContentPage实例。

此时运行程序,会看到和图14.12~14.14一样的运行效果。

Xamarin XAML语言教程控件模板的模板绑定的更多相关文章

  1. Xamarin XAML语言教程构建ControlTemplate控件模板 (四)

    Xamarin XAML语言教程构建ControlTemplate控件模板 (四) 2.在页面级别中构建控件模板 如果开发者要在页面级别中构建控件模板,首先必须将ResourceDictionary添 ...

  2. Xamarin XAML语言教程构建ControlTemplate控件模板 (三)

    Xamarin XAML语言教程构建ControlTemplate控件模板 (三) (3)打开MainPage.xaml.cs文件,编写代码,实现主题的切换功能.代码如下: using System; ...

  3. Xamarin XAML语言教程构建ControlTemplate控件模板 (二)

    Xamarin XAML语言教程构建ControlTemplate控件模板 (二) (2)打开MainPage.xaml文件,编写代码,将构建的控件模板应用于ContentView中.代码如下: &l ...

  4. Xamarin XAML语言教程构建ControlTemplate控件模板

    Xamarin XAML语言教程构建ControlTemplate控件模板 控件模板ControlTemplate ControlTemplate是从Xamarin.Forms 2.1.0开始被引入的 ...

  5. Xamarin XAML语言教程模板视图TemplatedView(二)

    Xamarin XAML语言教程模板视图TemplatedView(二) (2)打开MainPage.xaml文件,编写代码,将构建的控件模板应用于中TemplatedView.代码如下: <? ...

  6. Xamarin XAML语言教程模板视图TemplatedView(一)

    Xamarin XAML语言教程模板视图TemplatedView(一) 模板视图TemplatedView 与模板页面相对的是TemplatedView,它被称为模板视图,它的功能和模板页面类似,也 ...

  7. Xamarin XAML语言教程模板页面TemplatedPage

    Xamarin XAML语言教程模板页面TemplatedPage 模板页面TemplatedPage 在上文中我们提到了TemplatedPage,它被称为模板页面,用来显示控件模版.Templat ...

  8. Xamarin XAML语言教程基本页面ContentPage占用面积

    Xamarin XAML语言教程基本页面ContentPage占用面积 基本页面和基本视图都是在开发应用程序时最为常用的.本章将讲解有关基本页面ContentPag.基本视图ContentView.控 ...

  9. Xamarin XAML语言教程使用Xamarin Studio创建XAML(二)

    Xamarin XAML语言教程使用Xamarin Studio创建XAML(二) 使用Xamarin Studio创建XAML Xamarin Studio和Visual Studio创建XAML文 ...

随机推荐

  1. 洛谷P3763 [Tjoi2017]DNA 【后缀数组】

    题目链接 洛谷P3763 题解 后缀数组裸题 在BZOJ被卡常到哭QAQ #include<algorithm> #include<iostream> #include< ...

  2. 洛谷 P3203 [HNOI2010]弹飞绵羊 解题报告

    P3203 [HNOI2010]弹飞绵羊 题目描述 某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏.游戏一开始,Lostmonkey在地上沿着一 ...

  3. git config文件总结及git alias配置

    1. 文件位置 mac /etc/.gitconfig 系统级~/.gitconifg 用户级(覆盖系统级) windows C:\Users\$user\.gitconfig 当前项目下 .git/ ...

  4. CENSORING

    CENSORING 题目描述 FJ为它的奶牛订阅了很多杂志,balabala.......,其中有一些奶牛不宜的东西(比如如何煮牛排). FJ将杂志中所有的文章提取出来组成一个长度最多为10^5的字符 ...

  5. input 只允许输入数字

    onkeyup='this.value=this.value.replace(/[^0-9\-]/gi,"")'

  6. HDU2157 How many ways??---(邻接矩阵,图论,矩阵快速幂)

    http://acm.hdu.edu.cn/showproblem.php?pid=2157 How many ways?? Time Limit: 2000/1000 MS (Java/Others ...

  7. 图论:费用流-SPFA+EK

    利用SPFA+EK算法解决费用流问题 例题不够裸,但是还是很有说服力的,这里以Codevs1227的方格取数2为例子来介绍费用流问题 这个题难点在建图上,我感觉以后还要把网络流建模想明白才能下手去做这 ...

  8. poj1379 Run Away

    传送门:http://poj.org/problem?id=1379 [题解] 题目大意:求(0,0)->(X,Y)内的一个点,使得这个点到给定的n个点的最小距离最大. 模拟退火 一开始可以先把 ...

  9. codevs3160 最长公共子串

    传送门:http://codevs.cn/problem/3160/ [题解] CTSC前复习模板 sa的模板..记住基数排序就够了(还有height) 还有就是sa[i]表示排名为i的后缀是啥..r ...

  10. 汕头市队赛 SRM 06 B 起伏的排名

    B 起伏的排名 SRM 06 背景&&描述 天才麻将少女KPM立志要在日麻界闯出一番名堂.     在上个星期她打了n场麻将,每场麻将都有n名玩家.KPM自然记得自己的n次排名.   ...