博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
第十六章:数据绑定(八)
阅读量:6113 次
发布时间:2019-06-21

本文共 5804 字,大约阅读时间需要 19 分钟。

绑定和自定义视图

在第15章“交互式界面”中,您看到了一个名为CheckBox的自定义视图。此视图定义Text属性,用于设置CheckBox的文本以及FontSize属性。它也可以定义所有其他与文本相关的属性-TextColor,FontAttributes和FontFamily-但它

没有,主要是因为所涉及的工作。每个属性都需要一个BindableProperty定义,一个CLR属性定义和一个属性更改处理程序,它将属性的新设置传递给包含CheckBox视觉效果的Label视图。
通过消除propertychanged处理程序,数据绑定可以帮助简化某些属性的此过程。这是一个名为NewCheckBox的新版CheckBox的代码隐藏文件。与早期的类一样,它是Xamarin.FormsBook.Toolkit库的一部分。该文件已重新组织一点,以便每个BindableProperty定义与其对应的CLR属性定义配对。您可能更喜欢这种属性的源代码组织,或者可能不喜欢。

namespace Xamarin.FormsBook.Toolkit{    public partial class NewCheckBox : ContentView    {        public event EventHandler
CheckedChanged; public NewCheckBox() { InitializeComponent(); } // Text property. public static readonly BindableProperty TextProperty = BindableProperty.Create( "Text", typeof(string), typeof(NewCheckBox), null); public string Text { set { SetValue(TextProperty, value); } get { return (string)GetValue(TextProperty); } } // TextColor property. public static readonly BindableProperty TextColorProperty = BindableProperty.Create( "TextColor", typeof(Color), typeof(NewCheckBox), Color.Default); public Color TextColor { set { SetValue(TextColorProperty, value); } get { return (Color)GetValue(TextColorProperty); } } // FontSize property. public static readonly BindableProperty FontSizeProperty = BindableProperty.Create( "FontSize", typeof(double), typeof(NewCheckBox), Device.GetNamedSize(NamedSize.Default, typeof(Label))); [TypeConverter(typeof(FontSizeConverter))] public double FontSize { set { SetValue(FontSizeProperty, value); } get { return (double)GetValue(FontSizeProperty); } } // FontAttributes property. public static readonly BindableProperty FontAttributesProperty = BindableProperty.Create( "FontAttributes", typeof(FontAttributes), typeof(NewCheckBox), FontAttributes.None); public FontAttributes FontAttributes { set { SetValue(FontAttributesProperty, value); } get { return (FontAttributes)GetValue(FontAttributesProperty); } } // IsChecked property. public static readonly BindableProperty IsCheckedProperty = BindableProperty.Create( "IsChecked", typeof(bool), typeof(NewCheckBox), false, propertyChanged: (bindable, oldValue, newValue) => { // Fire the event. NewCheckBox checkbox = (NewCheckBox)bindable; EventHandler
eventHandler = checkbox.CheckedChanged; if (eventHandler != null) { eventHandler(checkbox, (bool)newValue); } }); public bool IsChecked { set { SetValue(IsCheckedProperty, value); } get { return (bool)GetValue(IsCheckedProperty); } } // TapGestureRecognizer handler. void OnCheckBoxTapped(object sender, EventArgs args) { IsChecked = !IsChecked; } }}

除了早期的Text和FontSize属性,此代码文件现在还定义了TextColor和FontAttributes属性。 但是,唯一的属性更改处理程序是IsChecked处理程序触发CheckedChanged事件。 其他所有内容都由XAML文件中的数据绑定处理:

root元素的名称为checkbox,StackLayout将其设置为BindingContext。然后,该StackLayout中的所有数据绑定都可以引用代码隐藏文件定义的属性。显示该框的第一个Label将其TextColor和FontSize属性绑定到基础属性的值,而Text属性则通过绑定来定位

使用BoolToStringConverter根据IsChecked属性显示空框或复选框。第二个Label更直接:Text,TextColor,FontSize和FontAttributes属性都绑定到代码隐藏文件中定义的相应属性。
如果您要创建包含Text元素的多个自定义视图,并且需要定义所有与文本相关的属性,那么您可能希望首先创建一个仅从CodeView派生的代码类(例如,名为CustomViewBase),仅包括那些基于文本的属性定义。然后,您可以从CustomViewBase派生其他类,并且可以使用Text和所有与文本相关的属性。
让我们编写一个名为NewCheckBoxDemo的小程序来演示NewCheckBox视图。与早期的CheckBoxDemo程序一样,这些复选框控制一段文本的粗体和斜体格式。但为了演示新属性,这些复选框被赋予颜色和字体属性,为了演示BoolToObjectConverter,其中一个复选框控制该段落的水平对齐:

注意Binding.Converter标记之间的BoolToObjectConverter。 因为它是泛型类,所以它需要一个x:TypeArguments属性,该属性指示TrueObject和FalseObject属性的类型以及Convert方法的返回值的类型。 TrueObject和FalseObject都设置为TextAlignment枚举的成员,转换器选择一个设置为Label的HorizontalTextAlignment属性,如以下屏幕截图所示:

2018_09_28_100354
但是,此程序仍需要一个代码隐藏文件来管理将斜体和粗体属性应用于文本块。 这些方法与早期CheckBoxDemo程序中的方法相同:

public partial class NewCheckBoxDemoPage : ContentPage{    public NewCheckBoxDemoPage()    {        InitializeComponent();    }    void OnItalicCheckBoxChanged(object sender, bool isChecked)    {        if (isChecked)        {            label.FontAttributes |= FontAttributes.Italic;        }        else        {            label.FontAttributes &= ~FontAttributes.Italic;        }    }   void OnBoldCheckBoxChanged(object sender, bool isChecked)    {        if (isChecked)        {            label.FontAttributes |= FontAttributes.Bold;        }        else        {            label.FontAttributes &= ~FontAttributes.Bold;        }    }}

Xamarin.Forms不支持“多重绑定”,可能允许组合多个绑定源来更改单个绑定目标。 绑定可以做很多事情,但是如果没有一些额外的代码支持,它们就无法做到。

代码仍有作用。

转载地址:http://ldjka.baihongyu.com/

你可能感兴趣的文章
IOC —— AOP
查看>>
比特币现金将出新招,推动比特币现金使用
查看>>
数据库的这些性能优化,你做了吗?
查看>>
某大型网站迁移总结(完结)
查看>>
mysql的innodb中事务日志(redo log)ib_logfile
查看>>
部署SSL证书后,网页内容造成页面错误提示的处理办法
查看>>
MS SQLSERVER通用存储过程分页
查看>>
60.使用Azure AI 自定义视觉服务实现物品识别Demo
查看>>
Oracle 冷备份
查看>>
jq漂亮实用的select,select选中后,显示对应内容
查看>>
C 函数sscanf()的用法
查看>>
python模块之hashlib: md5和sha算法
查看>>
linux系统安装的引导镜像制作流程分享
查看>>
解决ros建***能登录不能访问内网远程桌面的问题
查看>>
pfsense锁住自己
查看>>
vsftpd 相关总结
查看>>
bash complete -C command
查看>>
解决zabbix 3.0中1151端口不能运行问题
查看>>
售前工程师的成长---一个老员工的经验之谈
查看>>
Get到的优秀博客网址
查看>>