【Xamarin.Forms】可绑定属性——创建允许绑定的属性

简介: 在Xamarin.Forms中,公共语言运行库(CLR)属性的功能通过可绑定属性进行扩展。 可绑定属性是特殊类型的属性,属性的值由Xamarin.Forms属性系统跟踪。 本文介绍了可绑定属性,并演示了如何创建和使用它们。

在Xamarin.Forms中,公共语言运行库(CLR)属性的功能通过可绑定属性进行扩展。 可绑定属性是特殊类型的属性,属性的值由Xamarin.Forms属性系统跟踪。 本文介绍了可绑定属性,并演示了如何创建和使用它们。

概观

可绑定属性通过使用BindableProperty类型来支持属性来扩展CLR属性功能,而不是使用字段来支持属性。 可绑定属性的目的是提供一个支持通过父子关系设置的数据绑定,样式,模板和值的属性系统。 另外,可绑定属性可以提供默认值,属性值验证以及监视属性更改的回调。
属性应该作为可绑定属性来实现,以支持以下一个或多个功能:


  • 充当数据绑定的有效目标属性。
  • 通过样式设置属性。
  • 提供与属性类型的默认属性值不同的默认属性值。
  • 验证属性的值。
  • 监视属性更改。

Xamarin.Forms可绑定属性的示例包括Label.Text,Button.BorderRadius和StackLayout.Orientation。 每个可绑定属性都有一个类型为BindableProperty的相应公共静态只读属性,它暴露在相同的类上,并且是可绑定属性的标识符。 例如,Label.Text属性的相应可绑定属性标识符是Label.TextProperty。

创建和使用可绑定的属性

创建可绑定属性的过程如下所示:

  1. 使用BindableProperty.Create方法重载之一创建一个BindableProperty实例。
  2. 定义BindableProperty实例的属性访问器。

请注意,必须在UI线程上创建所有BindableProperty实例。 这意味着只有在UI线程上运行的代码才能获取或设置可绑定属性的值。 但是,通过使用Device.BeginInvokeOnMainThread方法封送到UI线程,可以从其他线程访问BindableProperty实例。

创建一个属性

为了创建一个BindableProperty实例,包含的类必须从BindableObject类派生。 但是,BindableObject类在类层次结构中很高,所以用于用户界面功能的大多数类都支持可绑定属性。
可以通过声明BindableProperty类型的公共静态只读属性来创建可绑定属性。 应将bindable属性设置为BindableProperty.Create方法重载之一的返回值。 声明应该位于BindableObject派生类的主体内,但不在任何成员定义之内。
创建BindableProperty时必须至少指定一个标识符以及以下参数:

  • BindableProperty的名称。
  • 属性的类型。
  • 拥有对象的类型。
  • 属性的默认值。 这可以确保该属性在未设置时始终返回特定的默认值,并且可以与该属性类型的默认值不同。 在可绑定属性上调用ClearValue方法时,将恢复默认值。

以下代码显示了一个可绑定属性的示例,其中包含四个必需参数的标识符和值:

点击(此处)折叠或打开

  1. public static readonly BindableProperty EventNameProperty =
  2.   BindableProperty.Create ("EventName", typeof(string), typeof(EventToCommandBehavior), null);
这将创建一个名为EventName的BindableProperty实例,类型为string。 该属性由EventToCommandBehavior类所有,并具有默认值null。 可绑定属性的命名约定是,可绑定属性标识符必须与Create方法中指定的属性名称匹配,并附加“Property”。 因此,在上面的例子中,可绑定的属性标识符是EventNameProperty。
或者,在创建BindableProperty实例时,可以指定以下参数:


  • 绑定模式。 这用于指定属性值更改传播的方向。 在默认绑定模式下,更改将从源传播到目标。
  • 将在设置属性值时调用的验证委托。 有关更多信息,请参阅验证回调。
  • 一个属性改变了委托,当属性值改变时将被调用。 有关更多信息,请参阅检测属性更改。
  • 属性更改委托,将在属性值更改时调用。 该委托具有与更改委托的属性相同的签名。
  • 强制值委托,将在属性值更改时调用。 有关更多信息,请参阅Coerce值回调。
  • 用于初始化默认属性值的Func。 有关更多信息,请参阅使用Func创建默认值。

创建访问器

属性访问器是必需的,才能使用属性语法来访问可绑定属性。 Get访问器应该返回包含在相应的可绑定属性中的值。 这可以通过调用GetValue方法,传入可获取值的可绑定属性标识符,然后将结果转换为所需的类型来实现。 Set访问器应该设置相应的可绑定属性的值。 这可以通过调用SetValue方法,传入要设置值的可绑定属性标识符以及要设置的值来实现。
以下代码示例显示了EventName可绑定属性的访问者:

点击(此处)折叠或打开

  1. public string EventName {
  2.   get { return (string)GetValue (EventNameProperty); }
  3.   set { SetValue (EventNameProperty, value); }
  4. }


使用Bindable属性

一旦创建了可绑定属性,就可以从XAML或代码中使用该属性。 在XAML中,这是通过声明带有前缀的名称空间来实现的,命名空间声明指示CLR名称空间名称,还可以选择使用程序集名称。 有关更多信息,请参阅XAML命名空间。
以下代码示例演示了包含可绑定属性的自定义类型的XAML名称空间,该属性在与引用自定义类型的应用程序代码相同的程序集中定义:

点击(此处)折叠或打开

  1. ContentPage ... xmlns:local="clr-namespace:EventToCommandBehavior" ...>
  2.   ...
  3. /ContentPage>
在设置EventName可绑定属性时使用了命名空间声明,如下面的XAML代码示例所示:

点击(此处)折叠或打开

  1. ListView ...>
  2.   ListView.Behaviors>
  3.     local:EventToCommandBehavior EventName="ItemSelected" ... />
  4.   /ListView.Behaviors>
  5. /ListView>
下面的代码示例中显示了等效的C#代码:

点击(此处)折叠或打开

  1. var listView = new ListView ();
  2. listView.Behaviors.Add (new EventToCommandBehavior {
  3.   EventName = "ItemSelected",
  4.   ...
  5. });

高级方案

创建BindableProperty实例时,可以设置许多可选参数以启用高级可绑定属性方案。 本节探讨这些情况。

检测属性更改

通过为BindableProperty.Create方法指定propertyChanged参数,可以使用可绑定属性注册静态属性更改的回调方法。 指定的回调方法将在可绑定属性的值更改时调用。
下面的代码示例显示了EventName绑定属性如何将OnEventNameChanged方法注册为属性更改的回调方法:

点击(此处)折叠或打开

  1. public static readonly BindableProperty EventNameProperty =
  2.   BindableProperty.Create (
  3.     "EventName", typeof(string), typeof(EventToCommandBehavior), null, propertyChanged: OnEventNameChanged);
  4. ...

  5. static void OnEventNameChanged (BindableObject bindable, object oldValue, object newValue)
  6. {
  7.   // Property changed implementation goes here
  8. }
在属性更改的回调方法中,BindableObject参数用于表示拥有的类的哪个实例已经报告了更改,并且这两个对象参数的值表示可绑定属性的旧值和新值。


验证回调

通过为BindableProperty.Create方法指定validateValue参数,可以向可绑定属性注册静态验证回调方法。 当设置了可绑定属性的值时,将调用指定的回调方法。
以下代码示例显示了Angle bindable属性如何将IsValidValue方法注册为验证回调方法:

点击(此处)折叠或打开

  1. public static readonly BindableProperty AngleProperty =
  2.   BindableProperty.Create ("Angle", typeof(double), typeof(HomePage), 0.0, validateValue: IsValidValue);
  3. ...

  4. static bool IsValidValue (BindableObject view, object value)
  5. {
  6.   double result;
  7.   bool isDouble = double.TryParse (value.ToString (), out result);
  8.   return (result >= 0 && result = 360);
  9. }
验证回调函数提供了一个值,如果值对于属性有效,则返回true,否则返回false。 如果验证回调返回false,则会引发异常,应由开发人员处理。 验证回调方法的典型用法是在设置可绑定属性时约束整数或双精度值。 例如,IsValidValue方法检查属性值是否在0到360范围内是double。



协助值回调

通过为BindableProperty.Create方法指定coerceValue参数,可以使用可绑定属性注册静态胁迫值回调方法。 指定的回调方法将在可绑定属性的值更改时调用。
Coerce值回调用于在属性值发生更改时强制对可绑定属性进行重新评估。 例如,可以使用胁迫值回调来确保一个可绑定属性的值不大于另一个可绑定属性的值。
下面的代码示例显示角度bindable属性如何将CoerceAngle方法注册为强制值回调方法:

点击(此处)折叠或打开

  1. public static readonly BindableProperty AngleProperty = BindableProperty.Create (
  2.   "Angle", typeof(double), typeof(HomePage), 0.0, coerceValue: CoerceAngle);
  3. public static readonly BindableProperty MaximumAngleProperty = BindableProperty.Create (
  4.   "MaximumAngle", typeof(double), typeof(HomePage), 360.0);
  5. ...

  6. static object CoerceAngle (BindableObject bindable, object value)
  7. {
  8.   var homePage = bindable as HomePage;
  9.   double input = (double)value;

  10.   if (input > homePage.MaximumAngle) {
  11.     input = homePage.MaximumAngle;
  12.   }

  13.   return input;
  14. }
CoerceAngle方法将检查MaximumAngle属性的值,如果Angle属性值大于此值,则会将值强制为MaximumAngle属性值。



用Func创建一个默认值

Func可以用来初始化可绑定属性的默认值,如以下代码示例所示:

点击(此处)折叠或打开

  1. public static readonly BindableProperty SizeProperty =
  2.   BindableProperty.Create ("Size", typeof(double), typeof(HomePage), 0.0,
  3.   defaultValueCreator: bindable => Device.GetNamedSize (NamedSize.Large, (Label)bindable));
defaultValueCreator参数设置为调用Device.GetNamedSize方法的Func,以返回一个double,该double表示在本机平台上的Label上使用的字体的命名大小。


概要

本文提供了可绑定属性的介绍,并演示了如何创建和使用它们。 可绑定属性是特殊类型的属性,属性的值由Xamarin.Forms属性系统跟踪。

目录
相关文章
|
XML Android开发 数据格式
【Xamarin.Forms】第2部分:基本的XAML语法——使用属性元素和附加属性
XAML主要用于实例化和初始化对象。 但是,通常情况下,属性必须设置为复杂的对象,不能很容易地表示为XML字符串,有时由一个类定义的属性必须设置在子类上。 这两个需求需要属性元素和附加属性的基本XAML语法功能。
1218 0
|
XML Android开发 数据格式
xamarin android自定义标题栏(自定义属性、回调事件)
自定义控件的基本要求 这篇文章就当是自定义控件入门,看了几篇android关于自定义控件的文章,了解了一下,android自定义控件主要有3种方式: 自绘控件:继承View类,所展示的内容在OnDraw方法中绘制出来 组合控件:不需要绘制视图显示的内容,只用系统原生的控件,将几个控件组合起来,(这就是这篇文章要写的自定义标题栏) 继承控件:继承原生的控件类,在原生的属性上增加新的功能。
1509 0
|
Java C# Android开发
Xamarin.Android中使用android:onClick="xxx"属性
原文: Xamarin.Android中使用android:onClick="xxx"属性 在原生Android开发中,为一个View增加点击事件,有三种方式; 1、使用匿名对象 ((ImageButton) findViewById(R.
1069 0
|
开发工具 Android开发 iOS开发
使用xamarin开发Android、iOS报错failed to open directory: 系统找不到指定的文件
使用vs2019学习xamarin时,创建新程序。使用模拟器真机等测试都报错如下图错误: ![请在此添加图片描述](https://developer-private-1258344699.cos.ap-guangzhou.myqcloud.com/column/article/5877188/20231030-de8ce5fd.png?x-cos-security-token=r4KyZDEowPT0kGTL0LqE8EnwfN1Nzexadb05dcffed3939ff8d7591c528c01706nvpGSE93QwHpZM8NwhJNTZctNRQa0l3KDhEnqj8P7d8t
118 0
使用xamarin开发Android、iOS报错failed to open directory: 系统找不到指定的文件
|
Java C# Android开发
.NET(WinCE、WM)开发转Android开发 ——Xamarin和Smobiler对比
WinCE从1995年诞生至今,已有20多年的发展历史,行业成熟方案覆盖范围广,从车载、工控、手持机都有涉及,且方案成熟。 近些年,Android以后来居上的态势,逐渐渗透至各行业领域,硬件手持大厂也把产品线重心向Android手持迁移,基于Android的行业解决方案越来越成熟,WinCE的开发人才流失,在WinCE解决方案上吃老本的企业寻求转型。
|
Web App开发 测试技术 Android开发
xamarin开发android收集的一些工具
原文:xamarin开发android收集的一些工具 xamarin开发android收集的一些工具 工欲善其事,必先利其器,从16年下半年开始做xamarin相关的开发,平时使用的一些工具和google插件给大家分享一下,都有下载地址,持续更新。
1535 0
|
前端开发 Android开发
Xamarin android中使用signalr实现即时通讯
前面几天也写了一些signalr的例子,不过都是在Web端,今天我就来实践一下如何在xamarin android中使用signalr,刚好工作中也用到了这个,也算是总结一下学到的东西吧,希望能帮助你们,更快地熟悉使用xamarin android进行即时通讯。
1444 0
|
XML Android开发 数据格式
Xamarin android spinner的使用方法
xamarin  android spinner的如何使用呢,大多数web开发人员经常会听到DropDownList 和Combobox 这种下拉选择框,spinner 的意思差不多,有道词典一下意思是“下拉列表”、“台湾斯普”,“下拉列表组件”,“微调控件”。
1589 0
|
XML Java Android开发
Xamarin android如何反编译apk文件
Xamarin android 如何反编译 apk文件 这里推荐一款XamarinAndroid开发的小游戏,撸棍英雄,游戏很简单,的确的是有点大。等一下我们来翻翻译这个Xamarin Android 开发的小游戏 下载链接:http://shouji.
1380 0
|
定位技术 开发工具 Android开发
Xamarin android如何调用百度地图入门示例(一)
在Xamarin android如何调用百度地图呢? 首先我们要区分清楚,百度地图这是一个广泛的概念,很多刚刚接触这个名词”百度地图api”,的确是泛泛而谈,我们来看一下百度地图的官网: android上使用百度地图的有Android地图SDK,定位SDK,导航SDK,全景SDK.
1503 0

热门文章

最新文章

下一篇
无影云桌面