Xamarin XAML语言教程控件模板的模板绑定
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语言教程控件模板的模板绑定的更多相关文章
- Xamarin XAML语言教程构建ControlTemplate控件模板 (四)
Xamarin XAML语言教程构建ControlTemplate控件模板 (四) 2.在页面级别中构建控件模板 如果开发者要在页面级别中构建控件模板,首先必须将ResourceDictionary添 ...
- Xamarin XAML语言教程构建ControlTemplate控件模板 (三)
Xamarin XAML语言教程构建ControlTemplate控件模板 (三) (3)打开MainPage.xaml.cs文件,编写代码,实现主题的切换功能.代码如下: using System; ...
- Xamarin XAML语言教程构建ControlTemplate控件模板 (二)
Xamarin XAML语言教程构建ControlTemplate控件模板 (二) (2)打开MainPage.xaml文件,编写代码,将构建的控件模板应用于ContentView中.代码如下: &l ...
- Xamarin XAML语言教程构建ControlTemplate控件模板
Xamarin XAML语言教程构建ControlTemplate控件模板 控件模板ControlTemplate ControlTemplate是从Xamarin.Forms 2.1.0开始被引入的 ...
- Xamarin XAML语言教程模板视图TemplatedView(二)
Xamarin XAML语言教程模板视图TemplatedView(二) (2)打开MainPage.xaml文件,编写代码,将构建的控件模板应用于中TemplatedView.代码如下: <? ...
- Xamarin XAML语言教程模板视图TemplatedView(一)
Xamarin XAML语言教程模板视图TemplatedView(一) 模板视图TemplatedView 与模板页面相对的是TemplatedView,它被称为模板视图,它的功能和模板页面类似,也 ...
- Xamarin XAML语言教程模板页面TemplatedPage
Xamarin XAML语言教程模板页面TemplatedPage 模板页面TemplatedPage 在上文中我们提到了TemplatedPage,它被称为模板页面,用来显示控件模版.Templat ...
- Xamarin XAML语言教程基本页面ContentPage占用面积
Xamarin XAML语言教程基本页面ContentPage占用面积 基本页面和基本视图都是在开发应用程序时最为常用的.本章将讲解有关基本页面ContentPag.基本视图ContentView.控 ...
- Xamarin XAML语言教程使用Xamarin Studio创建XAML(二)
Xamarin XAML语言教程使用Xamarin Studio创建XAML(二) 使用Xamarin Studio创建XAML Xamarin Studio和Visual Studio创建XAML文 ...
随机推荐
- 【COGS 461】[网络流24题] 餐巾 最小费用最大流
既然是最小费用最大流我们就用最大流来限制其一定能把每天跑满,那么把每个表示天的点向T连流量为其所需餐巾,费用为0的边,然后又与每天的餐巾对于买是无限制的因此从S向每个表示天的点连流量为INF,费用为一 ...
- spring 配置文件读取 mysql username报错
在配置项目中,spring读取jdbc.properties文件连接mysql时报错: java.sql.SQLException: Access denied for user 'Admini ...
- Java Error: Failed to validate certificate. The application will not be executed
Hi, last week a customer had the problem that he wants to connect to the administration interface of ...
- POJ 3070 + 51Nod 1242 大斐波那契数取余
POJ 3070 #include "iostream" #include "cstdio" using namespace std; class matrix ...
- python并发进程
1 引言 2 创建进程 2.1 通过定义函数的方式创建进程 2.2 通过定义类的方式创建进程 3 Process中常用属性和方法 3.1 守护进程:daemon 3.2 进程终结于存活检查:termi ...
- JAVA 成员访问权限修饰符
修饰符 类内部 package内 子类 其他 public 允许 允许 ...
- Intellij IDEA创建spring MVC项目
相信各位未来的Java工程师已经接触到了spring MVC这个框架的强大之处,看了很多的教程,都是eclipse的,在intellij IDEA这个强大的工具面前居然不能很顺畅的,今天我就带领大家用 ...
- 原生sql和django的事务控制
def test(request): with connections['default'].cursor() as c: try: with transaction.atomic(using='de ...
- Swift教程之运算符重载
http://blog.csdn.net/mengxiangyue/article/details/43437797 原文地址:http://www.raywenderlich.com/80818/o ...
- (转)Oracle中判断某字段不为空及为空的SQL语句
比如 insert into table a (a1,b1)values("a1",''); 对于这种情况,因为表里存的是'',其实是没有内容的,要查询这个字段,不能直接使用 se ...