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.BorderRadiusa 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í:

  1. Vytvořte BindableProperty instanci s jedním z BindableProperty.Create přetížení metody.
  2. 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í BindablePropertyidentifiká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í falsezpě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ě.