附加行为
将功能添加到控件中,无需进行子类化
附加行为是具有一个或多个附加属性的静态类。本文演示如何创建和使用附加的行为。
概观
附加属性是一种特殊类型的可绑定属性。它们在一个类中定义,但是附加到其他对象,并且它们在XAML中可识别为包含以期间分隔的类和属性名称的属性。
附加属性可以定义propertyChanged
当属性的值更改时将执行的委托,例如在控件上设置属性时。当propertyChanged
委托执行时,它将传递一个对它所附加的控件的引用,以及包含属性的旧值和新值的参数。该委托可用于通过操作传入的引用将新功能添加到属性附加到的控件,如下所示:
- 的
propertyChanged
委托注塑控制引用,它被接收为一个BindableObject
,以该行为被设计成增强的控件类型。 - 该
propertyChanged
代表修改控件的属性,调用控件的方法,或者注册了由控制曝光事件的事件处理程序,以实现核心行为的功能。
附加行为的一个问题是它们在static
类中定义,具有static
属性和方法。这使得很难创建具有状态的附加行为。此外,Xamarin.Forms行为已经取代附加行为作为行为建构的首选方法。有关Xamarin.Forms行为的更多信息,请参阅Xamarin.Forms行为和可重用行为。
创建附加行为
示例应用程序演示了一个NumericValidationBehavior
,它突出显示用户输入Entry
红色控件的值(如果不是)double
。行为如下代码示例所示:
public static class NumericValidationBehavior
{
public static readonly BindableProperty AttachBehaviorProperty =
BindableProperty.CreateAttached (
"AttachBehavior",
typeof(bool),
typeof(NumericValidationBehavior),
false,
propertyChanged:OnAttachBehaviorChanged);
public static bool GetAttachBehavior (BindableObject view)
{
return (bool)view.GetValue (AttachBehaviorProperty);
}
public static void SetAttachBehavior (BindableObject view, bool value)
{
view.SetValue (AttachBehaviorProperty, value);
}
static void OnAttachBehaviorChanged (BindableObject view, object oldValue, object newValue)
{
var entry = view as Entry;
if (entry == null) {
return;
}
bool attachBehavior = (bool)newValue;
if (attachBehavior) {
entry.TextChanged += OnEntryTextChanged;
} else {
entry.TextChanged -= OnEntryTextChanged;
}
}
static void OnEntryTextChanged (object sender, TextChangedEventArgs args)
{
double result;
bool isValid = double.TryParse (args.NewTextValue, out result);
((Entry)sender).TextColor = isValid ? Color.Default : Color.Red;
}
}
的NumericValidationBehavior
类包含一个名为附加属性AttachBehavior
与static
获取和设置,其控制增加或移除的行为的给其将要连接的控制。此附加属性注册OnAttachBehaviorChanged
将在属性的值更改时执行的方法。该方法TextChanged
基于AttachBehavior
附加属性的值注册或取消注册事件的事件处理程序。行为的核心功能是通过OnEntryTextChanged
方法提供的,该方法解析Entry
用户输入的值,TextColor
如果值不是,则将属性设置为红色double
。
消费附加行为
的NumericValidationBehavior
类可以通过添加被消耗AttachBehavior
附加属性到一个Entry
控制,如在下面的XAML代码示例表明:
<ContentPage ... xmlns:local="clr-namespace:WorkingWithBehaviors;assembly=WorkingWithBehaviors" ...>
...
<Entry Placeholder="Enter a System.Double" local:NumericValidationBehavior.AttachBehavior="true" />
...
</ContentPage>
Entry
C#中的等效项显示在以下代码示例中:
var entry = new Entry { Placeholder = "Enter a System.Double" };
NumericValidationBehavior.SetAttachBehavior (entry, true);
在运行时,根据行为实现,行为将响应与控件的交互。以下屏幕截图演示了响应无效输入的附加行为:
为特定控件类型(或可应用于许多控件的超类)编写附加行为,并且只应将其添加到兼容控件中。尝试将行为附加到不兼容的控件将导致未知的行为,并取决于行为实现。
从控件中删除附加行为
的NumericValidationBehavior
类可以从一个控制通过设置去除AttachBehavior
附着属性false
,如下面的XAML代码示例表明:
<Entry Placeholder="Enter a System.Double" local:NumericValidationBehavior.AttachBehavior="false" />
Entry
C#中的等效项显示在以下代码示例中:
var entry = new Entry { Placeholder = "Enter a System.Double" };
NumericValidationBehavior.SetAttachBehavior (entry, false);
在运行时,OnAttachBehaviorChanged
当AttachBehavior
附加属性的值设置为该方法时,将执行该方法false
。OnAttachBehaviorChanged
然后,该方法将取消注册事件的事件处理程序TextChanged
,确保在用户与控件交互时不会执行该行为。
概要
本文演示了如何创建和使用附加的行为。附加行为是static
具有一个或多个附加属性的类。