一个好老好老的老程序员了。
全部博文(915)
分类: Android平台
2019-10-30 21:05:30
在第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文件中的数据绑定处理:
点击(此处)折叠或打开
点击(此处)折叠或打开
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不支持“多重绑定”,可能允许组合多个绑定源来更改单个绑定目标。 绑定可以做很多事情,但是如果没有一些额外的代码支持,它们就无法做到。
代码仍有作用。