附加行为
“附加行为是具有一个或多个附加属性的静态类。 本文演示如何创建和使用附加行为。”
概述
附加属性是特殊的可绑定属性。 附加属性在一个类中定义,但可附加到其他对象,并且在 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
类包含带有 static
getter 和 setter 且名为 AttachBehavior
的附加属性,该属性控制将附加行为的控件添加和删除行为。 该附加属性注册属性值更改时执行的 OnAttachBehaviorChanged
方法。 此方法根据 AttachBehavior
附加属性的值为 TextChanged
事件注册或注销事件处理程序。 该行为的核心功能由 OnEntryTextChanged
方法提供,该方法解析用户输入到 Entry
中的值,如果该值不是 double
,则将 TextColor
属性设置为红色。
使用附加行为
可通过向 Entry
控件添加 AttachBehavior
附加属性来使用 NumericValidationBehavior
类,如下面的 XAML 代码示例所示:
<ContentPage ... xmlns:local="clr-namespace:WorkingWithBehaviors;assembly=WorkingWithBehaviors" ...>
...
<Entry Placeholder="Enter a System.Double" local:NumericValidationBehavior.AttachBehavior="true" />
...
</ContentPage>
下面的代码示例介绍了 C# 中的等效 Entry
:
var entry = new Entry { Placeholder = "Enter a System.Double" };
NumericValidationBehavior.SetAttachBehavior (entry, true);
在运行时,根据行为实现,行为将响应与控件的交互。 以下屏幕截图演示了响应无效输入的附加行为:
注意
附加行为是为特定的控件类型(或者可以应用于许多控件的超类)编写的,它们只应添加到可兼容的控件中。 试图将行为附加到不可兼容的控件将导致未知行为,且这取决于行为实现。
从控件中删除附加行为
通过将 AttachBehavior
附加属性设置为 false
,可以从控件中删除 NumericValidationBehavior
类,如下面的 XAML 代码示例所示:
<Entry Placeholder="Enter a System.Double" local:NumericValidationBehavior.AttachBehavior="false" />
下面的代码示例介绍了 C# 中的等效 Entry
:
var entry = new Entry { Placeholder = "Enter a System.Double" };
NumericValidationBehavior.SetAttachBehavior (entry, false);
在运行时,如果 AttachBehavior
附加属性的值设置为 false
时,则将执行 OnAttachBehaviorChanged
方法。 然后,OnAttachBehaviorChanged
方法将注销 TextChanged
事件的事件处理程序,确保用户与控件交互时不执行该行为。
总结
本文演示如何创建和使用附加行为。 附加行为是具有一个或多个附加属性的 static
类。