首先您需要先產生一個類別。
使用
BindableProperty.CreateAttached
靜態方法,產生一個附加屬性物件,在產生這個附加屬性的當時,定義 propertyChanged
引數,用於設定當該附加屬性值有異動的時候,需要呼叫的委派方法;在這個方法內,將會依據新設定的附加屬性值,設定所附加這個 Entry
的浮水印、字體大小、輸入鍵盤的屬性;若附加屬性並不是設定 Entry 控制項內,則不會做任何處理動作。using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Xamarin.Forms;
namespace AttProp
{
public class EntryTypeAttached
{
public static readonly BindableProperty EntryTypeProperty =
BindableProperty.CreateAttached(
propertyName: "EntryType",
returnType: typeof(string),
declaringType: typeof(Entry),
defaultValue: null,
defaultBindingMode: BindingMode.OneWay,
validateValue: null,
propertyChanged: OnEntryTypeChanged);
private static void OnEntryTypeChanged(BindableObject bindable, object oldValue, object newValue)
{
var fooEntry = bindable as Entry;
if (fooEntry == null)
return;
var foooldValue = (oldValue as string)?.ToLower();
var foonewValue = (newValue as string)?.ToLower();
if(foonewValue == null)
{
return;
}
switch (foonewValue)
{
case "None":
break;
case "email":
fooEntry.SetValue(Entry.PlaceholderProperty, "請輸入電子郵件");
fooEntry.Keyboard = Keyboard.Email;
fooEntry.FontSize = 20;
break;
case "phone":
fooEntry.SetValue(Entry.PlaceholderProperty, "請輸入電話號碼");
fooEntry.Keyboard = Keyboard.Telephone;
fooEntry.FontSize = 20;
break;
case "number":
fooEntry.SetValue(Entry.PlaceholderProperty, "請輸入數值");
fooEntry.Keyboard = Keyboard.Numeric;
fooEntry.FontSize = 20;
break;
default:
break;
}
}
// Helper methods for attached bindable property.
public static void SetEntryType(BindableObject bindable, string entryType)
{
bindable.SetValue(EntryTypeProperty, entryType);
}
public static string GetEntryType(BindableObject bindable)
{
return (string)bindable.GetValue(EntryTypeProperty);
}
}
}
當要引用這個附加屬性到
Entry
控制項內,可參考底下用法:
在這裡,您需要先定義使用這個附加屬性的 XAML 命名空間,您可以在根項目內,使用
xmlns:CustomAttached="clr-namespace:AttProp"
來加入新可使用的 XAML 命名空間。
此時,您就可以在 XAML 頁面中,在
Entry
控制項內,使用這個新建立的附加屬性 : <EntryCustomAttached:EntryTypeAttached.EntryType="Email" />
<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:prism="clr-namespace:Prism.Mvvm;assembly=Prism.Forms"
prism:ViewModelLocator.AutowireViewModel="True"
xmlns:CustomAttached="clr-namespace:AttProp"
x:Class="AttProp.Views.MainPage"
Title="MainPage">
<StackLayout HorizontalOptions="Center" VerticalOptions="Center">
<Label Text="自訂附加屬性 Attached Property" />
<Entry />
<Entry CustomAttached:EntryTypeAttached.EntryType="Email" />
<Entry CustomAttached:EntryTypeAttached.EntryType="Phone" />
<Entry CustomAttached:EntryTypeAttached.EntryType="Number" />
</StackLayout>
</ContentPage>
Grid.Row
這樣用法的附加屬性;這裡,將會新建一個附加屬性類別,當這個附加屬性設定在Entry
控制項上的時候,就會自動設定該Entry
控制項上的其他相關屬性。