Xamarin.Forms Vlastnosti s možností vazby
Vlastnosti s možností vazby rozšiřují funkce vlastnosti CLR zálohováním vlastnosti s BindableProperty
typem místo zálohování vlastnosti s polem. Účelem vazebných vlastností je poskytnout systém vlastností, který podporuje datové vazby, styly, šablony a hodnoty nastavené prostřednictvím relací nadřazený-podřízený. Kromě toho můžou vlastnosti s možností vazby poskytovat výchozí hodnoty, ověřování hodnot vlastností a zpětná volání, která monitorují změny vlastností.
Vlastnosti by se měly implementovat jako vlastnosti s možností vazby, aby podporovaly jednu nebo více následujících funkcí:
- Funguje jako platná cílová vlastnost datové vazby.
- Nastavení vlastnosti stylem
- Zadejte výchozí hodnotu vlastnosti, která se liší od výchozího typu vlastnosti.
- Ověření hodnoty vlastnosti.
- Monitorování změn vlastností
Xamarin.Forms Příklady svázatelných vlastností zahrnují Label.Text
, Button.BorderRadius
a StackLayout.Orientation
. Každá vlastnost bindable má odpovídající public static readonly
pole typu BindableProperty
, které je vystaveno ve stejné třídě a je identifikátor vlastnosti bindable. Například odpovídající identifikátor vlastnosti s možností vázání pro Label.Text
vlastnost je Label.TextProperty
.
Vytvoření vlastnosti s možností vytvoření vazby
Proces vytvoření vlastnosti bindable je následující:
- Vytvořte
BindableProperty
instanci s jedním zBindableProperty.Create
přetížení metody. - Definujte přístupové objekty vlastností pro
BindableProperty
instanci.
Všechny BindableProperty
instance musí být vytvořeny ve vlákně uživatelského rozhraní. To znamená, že pouze kód, který běží na vlákně uživatelského rozhraní, může získat nebo nastavit hodnotu bindable vlastnosti. BindableProperty
K instancím je však možné přistupovat z jiných vláken zařazováním do vlákna uživatelského rozhraní pomocí Device.BeginInvokeOnMainThread
metody.
Vytvoření vlastnosti
Chcete-li vytvořit BindableProperty
instanci, musí obsahující třída odvodit z BindableObject
třídy. BindableObject
Třída je však v hierarchii tříd vysoká, takže většina tříd používaných pro funkce uživatelského rozhraní podporuje vlastnosti svázatelné.
Vlastnost s možností vazby lze vytvořit deklarací public static readonly
vlastnosti typu BindableProperty
. Vlastnost bindable by měla být nastavena na vrácenou hodnotu jednoho z BindableProperty.Create
přetížení metody. Deklarace by měla být v těle BindableObject
odvozené třídy, ale mimo definice členů.
Při vytváření BindableProperty
identifikátoru musí být minimálně zadán identifikátor spolu s následujícími parametry:
- Název procesu
BindableProperty
. - Typ proměnné
- Typ vlastnícího objektu.
- Výchozí hodnota vlastnosti. Tím se zajistí, že vlastnost vždy vrátí určitou výchozí hodnotu, když je nenasazená, a může se lišit od výchozí hodnoty pro typ vlastnosti. Výchozí hodnota bude obnovena při
ClearValue
zavolání metody v bindable vlastnost.
Důležité
Konvence vytváření názvů pro vlastnosti bindable je, že identifikátor vlastnosti bindable se musí shodovat s názvem vlastnosti zadaný v Create
metodě, s "Property" připojena k němu.
Následující kód ukazuje příklad bindable vlastnosti s identifikátorem a hodnotami pro čtyři požadované parametry:
public static readonly BindableProperty EventNameProperty =
BindableProperty.Create ("EventName", typeof(string), typeof(EventToCommandBehavior), null);
Tím se BindableProperty
vytvoří instance s názvem EventNameProperty
, typu string
. Vlastnost je vlastněna EventToCommandBehavior
třídou a má výchozí hodnotu null
.
Volitelně můžete při vytváření BindableProperty
instance zadat následující parametry:
- Režim vazby. Slouží k určení směru, ve kterém se změny hodnoty vlastnosti rozšíří. Ve výchozím režimu vazby se změny rozšíří ze zdroje do cíle.
- Delegát ověření, který bude vyvolán při nastavení hodnoty vlastnosti. Další informace naleznete v tématu Zpětná volání ověřování.
- Změna delegáta vlastnosti, která bude vyvolána při změně hodnoty vlastnosti. Další informace naleznete v tématu Detekce změn vlastností.
- Změna vlastnosti delegáta, která bude vyvolána při změně hodnoty vlastnosti. Tento delegát má stejný podpis jako vlastnost, která změnila delegáta.
- Delegát hodnoty převodu, který bude vyvolán při změně hodnoty vlastnosti. Další informace naleznete v tématu Zpětná volání hodnoty v coerce.
- Slouží
Func
k inicializaci výchozí hodnoty vlastnosti. Další informace naleznete v tématu Vytvoření výchozí hodnoty pomocí func.
Vytváření přístupových objektů
Přístup k vlastnosti s možností vázání vyžaduje přístup k syntaxi vlastností. Přistupovací Get
objekt by měl vrátit hodnotu obsaženou v odpovídající svázatelné vlastnosti. Toho lze dosáhnout voláním GetValue
metody, předáním identifikátoru vlastnosti bindable, na kterém získat hodnotu, a následným přetypováním výsledku na požadovaný typ. Přistupovací Set
objekt by měl nastavit hodnotu odpovídající vlastnosti s možností vazby. Toho lze dosáhnout voláním SetValue
metody, předáním identifikátoru vlastnosti bindable, na kterém chcete nastavit hodnotu, a hodnotu, která se má nastavit.
Následující příklad kódu ukazuje přístupové objekty pro EventName
bindable vlastnost:
public string EventName
{
get { return (string)GetValue (EventNameProperty); }
set { SetValue (EventNameProperty, value); }
}
Využití vlastnosti s možností vytvoření vazby
Jakmile je vytvořena vlastnost bindable, může být využita z XAML nebo kódu. V JAZYCE XAML toho dosáhnete deklarováním oboru názvů s předponou, deklarací oboru názvů označující název oboru názvů CLR a volitelně název sestavení. Další informace naleznete v tématu Obory názvů XAML.
Následující příklad kódu ukazuje obor názvů XAML pro vlastní typ, který obsahuje bindable vlastnost, která je definována ve stejném sestavení jako kód aplikace odkazující na vlastní typ:
<ContentPage ... xmlns:local="clr-namespace:EventToCommandBehavior" ...>
...
</ContentPage>
Deklarace oboru názvů se používá při nastavování EventName
vlastnosti bindable, jak je znázorněno v následujícím příkladu kódu XAML:
<ListView ...>
<ListView.Behaviors>
<local:EventToCommandBehavior EventName="ItemSelected" ... />
</ListView.Behaviors>
</ListView>
Ekvivalentní kód jazyka C# je znázorněn v následujícím příkladu kódu:
var listView = new ListView ();
listView.Behaviors.Add (new EventToCommandBehavior
{
EventName = "ItemSelected",
...
});
Pokročilé scénáře
Při vytváření BindableProperty
instance existuje několik volitelných parametrů, které je možné nastavit tak, aby umožňovaly pokročilé scénáře vlastností s možností vázání. Tato část popisuje tyto scénáře.
Detekce změn vlastností
static
Metodu zpětného volání změněnou vlastností lze zaregistrovat pomocí bindable vlastnosti zadáním propertyChanged
parametru pro metoduBindableProperty.Create
. Zadaná metoda zpětného volání bude vyvolána při změně hodnoty bindable vlastnosti.
Následující příklad kódu ukazuje, jak EventName
bindable vlastnost registruje metodu OnEventNameChanged
jako metodu zpětného volání změněné vlastností:
public static readonly BindableProperty EventNameProperty =
BindableProperty.Create (
"EventName", typeof(string), typeof(EventToCommandBehavior), null, propertyChanged: OnEventNameChanged);
...
static void OnEventNameChanged (BindableObject bindable, object oldValue, object newValue)
{
// Property changed implementation goes here
}
V metodě zpětného volání změněné vlastností BindableObject
se parametr používá k označení, která instance vlastnící třídy oznámila změnu a hodnoty těchto dvou object
parametrů představují staré a nové hodnoty bindable vlastnosti.
Zpětná volání ověřování
static
Ověřovací metodu zpětného volání lze zaregistrovat pomocí vlastnosti bindable zadáním validateValue
parametru pro metoduBindableProperty.Create
. Zadaná metoda zpětného volání bude vyvolána při nastavení hodnoty bindable vlastnost.
Následující příklad kódu ukazuje, jak Angle
bindable vlastnost registruje metodu IsValidValue
jako ověřovací metodu zpětného volání:
public static readonly BindableProperty AngleProperty =
BindableProperty.Create ("Angle", typeof(double), typeof(HomePage), 0.0, validateValue: IsValidValue);
...
static bool IsValidValue (BindableObject view, object value)
{
double result;
bool isDouble = double.TryParse (value.ToString (), out result);
return (result >= 0 && result <= 360);
}
Ověřovací zpětná volání jsou poskytována s hodnotou a měla by se vrátit true
, pokud je hodnota platná pro vlastnost, jinak false
. Výjimka se vyvolá, pokud se vrátí false
zpětná volání pro ověření , která by měla být zpracována vývojářem. Typické použití metody zpětného volání ověřování omezuje hodnoty celých čísel nebo zdvojnásobí při nastavení bindable vlastnost. Metoda například zkontroluje IsValidValue
, že hodnota vlastnosti je double
v rozsahu 0 až 360.
Zpětná volání hodnoty vyučovacími funkcemi
Metodu static
zpětného volání hodnoty coerce lze zaregistrovat pomocí bindable vlastnosti zadáním coerceValue
parametru pro metodu BindableProperty.Create
. Zadaná metoda zpětného volání bude vyvolána při změně hodnoty bindable vlastnosti.
Důležité
Typ BindableObject
má metodu CoerceValue
, která může být volána k vynucení opětovného hodnocení hodnoty argumentu BindableProperty
vyvoláním zpětného volání hodnoty coerce.
Zpětné volání hodnoty vynucuje opětovné hodnocení vlastnosti bindable při změně hodnoty vlastnosti. Zpětné volání hodnoty převodu hodnoty lze například použít k zajištění, že hodnota jedné bindable vlastnosti není větší než hodnota jiné bindable vlastnosti.
Následující příklad kódu ukazuje, jak Angle
bindable vlastnost registruje metodu CoerceAngle
jako metodu zpětného volání hodnoty coerce:
public static readonly BindableProperty AngleProperty = BindableProperty.Create (
"Angle", typeof(double), typeof(HomePage), 0.0, coerceValue: CoerceAngle);
public static readonly BindableProperty MaximumAngleProperty = BindableProperty.Create (
"MaximumAngle", typeof(double), typeof(HomePage), 360.0, propertyChanged: ForceCoerceValue);
...
static object CoerceAngle (BindableObject bindable, object value)
{
var homePage = bindable as HomePage;
double input = (double)value;
if (input > homePage.MaximumAngle)
{
input = homePage.MaximumAngle;
}
return input;
}
static void ForceCoerceValue(BindableObject bindable, object oldValue, object newValue)
{
bindable.CoerceValue(AngleProperty);
}
Metoda CoerceAngle
zkontroluje hodnotu MaximumAngle
vlastnosti a pokud Angle
je hodnota vlastnosti větší, převede hodnotu na MaximumAngle
hodnotu vlastnosti. Kromě toho, když MaximumAngle
vlastnost změní zpětné volání hodnoty coerce je vyvolána na Angle
vlastnosti voláním CoerceValue
metody.
Vytvoření výchozí hodnoty pomocí funcu
A Func
lze použít k inicializaci výchozí hodnoty bindable vlastnosti, jak je znázorněno v následujícím příkladu kódu:
public static readonly BindableProperty SizeProperty =
BindableProperty.Create ("Size", typeof(double), typeof(HomePage), 0.0,
defaultValueCreator: bindable => Device.GetNamedSize (NamedSize.Large, (Label)bindable));
Parametr defaultValueCreator
je nastaven na Func
vyvolání metody, která vrátí Device.GetNamedSize
pojmenovanou double
velikost písma použitého na Label
nativní platformě.