Xamarin.Forms Vlastnosti s možností vazby

Ukázka stažení Stažení ukázky

Vlastnosti, které je třeba vytvořit, přesahují funkci CLR, a to tak, že předá BindableProperty vlastnost s polem a nepoužijete vlastnost s typem. Účelem vlastností s možností vazby je poskytnout systém vlastností, který podporuje datové vazby, styly, šablony a hodnoty nastavené prostřednictvím vztahů nadřazenosti a podřízenosti. Kromě toho mohou vlastnosti s možností vazby poskytovat výchozí hodnoty, ověřování hodnot vlastností a zpětná volání, která sledují 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á vlastnost target pro datovou vazbu.
  • Nastavení vlastnosti pomocí stylu.
  • Zadání výchozí hodnoty vlastnosti, která se liší od výchozí hodnoty pro typ vlastnosti.
  • Ověřuje se hodnota vlastnosti.
  • Změny vlastností monitorování.

Mezi příklady Xamarin.Forms vlastností s možností vazby patří Xamarin_Forms Xamarin.Forms _Label_Text "data-LINKTYPE =" absolutní cesta ">Xamarin_Forms _Button_BorderRadius data-LINKTYPE Label.Text =" absolutní cesta ">Button.BorderRadius a Xamarin_Forms _StackLayout_Orientation Label.Text " data-LINKTYPE = "absolutní cesta" >StackLayout.Orientation . Každá vlastnost s možností vazby má odpovídající public static readonly pole typu BindableProperty , které je vystaveno na stejné třídě a která je identifikátorem vlastnosti s možností vazby. Například odpovídající identifikátor vlastnosti s možností vazby pro Label.Text vlastnost je Label.TextProperty .

Vytvoření vlastnosti s možností vazby

Postup vytvoření vlastnosti s možností vazby je následující:

  1. Vytvořte BindableProperty instanci s jedním z BindableProperty.Create přetížení metod.
  2. Definujte přistupující objekty vlastnosti 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ěží ve vlákně uživatelského rozhraní, může získat nebo nastavit hodnotu vlastnosti s možností vazby. BindablePropertyK instancím je však možné přidružit z jiných vláken zařazováním do vlákna uživatelského rozhraní pomocí Xamarin_Forms BindableProperty _Device_BeginInvokeOnMainThread_System_Action_ "data-LINKTYPE =" absolutní cesta ">Device.BeginInvokeOnMainThread metoda.

Vytvoření vlastnosti

Chcete-li vytvořit BindableProperty instanci, obsažená třída musí být odvozena od BindableObject třídy. BindableObjectTří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 vazby vlastností.

Vlastnost s možností vazby lze vytvořit deklarováním public static readonly vlastnosti typu BindableProperty . Vlastnost s možností vazby by měla být nastavená na vrácenou hodnotu jednoho z Xamarin_Forms _BindableProperty_Create_System_String_System_Type_System_Type_System_Object_ Xamarin_Forms _BindingMode_ Xamarin_Forms _BindableProperty_ValidateValueDelegate_ Xamarin_Forms _BindableProperty_BindingPropertyChangedDelegate_ Xamarin_Forms _BindableProperty_BindingPropertyChangingDelegate_ Xamarin_Forms _BindableProperty_CoerceValueDelegate_ Xamarin_Forms "data-LINKTYPE =". absolutní cesta >BindableProperty.Create přetížení metody. Deklarace by měla být v těle BindableObject odvozené třídy, ale mimo jakékoli definice členů.

Při vytváření a se musí zadat minimálně identifikátor BindableProperty , 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í konkrétní výchozí hodnotu, pokud je nastavená, a může se lišit od výchozí hodnoty pro typ vlastnosti. Výchozí hodnota bude obnovena v případě, _BindableObject_ClearValue_ Xamarin_Forms že Xamarin_Forms je pro ClearValue vlastnost _BindableProperty_ volána metoda data-LINKTYPE = "absolutní cesta" >.

Důležité

Konvence pojmenování vlastností s možností vazby je taková, že identifikátor vlastnosti s možností vazby musí odpovídat názvu vlastnosti uvedenému v Create metodě s připojenou vlastností.

Následující kód ukazuje příklad vlastnosti s možností vazby 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 vytvoří BindableProperty instance s názvem EventNameProperty typu string . Vlastnost je vlastněna EventToCommandBehavior třídou a má výchozí hodnotu null .

Volitelně lze při vytváření BindableProperty instance zadat následující parametry:

  • Režim vazby. Slouží k určení směru, ve kterém se budou šířit změny hodnot vlastností. Ve výchozím režimu vazby budou změny rozšířeny ze zdroje do cíle.
  • Ověřovací delegát, který bude vyvolán při nastavení hodnoty vlastnosti. Další informace najdete v tématu zpětná volání ověřování.
  • Vlastnost změnila delegáta, která bude vyvolána při změně hodnoty vlastnosti. Další informace najdete v tématu zjištění změn vlastností.
  • Vlastnost, která mění delegáta, která bude vyvolána, když se změní hodnota vlastnosti. Tento delegát má stejný podpis jako vlastnost změnil delegát.
  • Delegát převedené hodnoty, který bude vyvolán při změně hodnoty vlastnosti. Další informace najdete v tématu převolání funkcí s převedenými hodnotami.
  • FuncKterý slouží k inicializaci výchozí hodnoty vlastnosti. Další informace najdete v tématu Vytvoření výchozí hodnoty pomocí funkce Func.

Vytvoření přístupových objektů

Přistupující objekty vlastnosti jsou požadovány pro přístup k vlastnosti s možností vazby pomocí syntaxe vlastnosti. GetPřistupující objekt by měl vracet hodnotu, která je obsažena v odpovídající vlastnosti BIND. Toho lze dosáhnout voláním metody Xamarin_Forms _BindableObject_GetValue_ Xamarin_Forms _BindableProperty_ "data-LINKTYPE =" absolutní cesta ">GetValue metoda, která předává identifikátor vlastnosti s možností vazby, pro který má být získána hodnota, a poté přetypování výsledku na požadovaný typ. SetPřistupující objekt by měl nastavit hodnotu odpovídající vlastnosti BIND. Toho lze dosáhnout voláním metody Xamarin_Forms _BindableObject_SetValue_ Xamarin_Forms _BindableProperty_System_Object_ "data-LINKTYPE =" absolutní cesta ">SetValue metoda, která předává identifikátor vlastnosti s možností vazby, pro který chcete nastavit hodnotu, a hodnotu, která má být nastavena.

Následující příklad kódu ukazuje přistupující objekty pro EventName vlastnost Bind:

public string EventName
{
  get { return (string)GetValue (EventNameProperty); }
  set { SetValue (EventNameProperty, value); }
}

Spotřebovat vlastnost s možností vazby

Jakmile je vlastnost s možností vazby vytvořena, lze ji spotřebovat z XAML nebo kódu. V jazyce XAML je to dosaženo deklarováním oboru názvů s předponou, s deklarací oboru názvů, která označuje 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 vlastnost s možností vazby, která je definována v rámci stejného sestavení jako kód aplikace, který odkazuje na vlastní typ:

<ContentPage ... xmlns:local="clr-namespace:EventToCommandBehavior" ...>
  ...
</ContentPage>

Deklarace oboru názvů se používá při nastavování EventName vlastnosti BIND, 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 zobrazen 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é lze nastavit tak, aby umožňovaly pokročilé scénáře vlastností BIND. V této části se seznámíte s těmito scénáři.

Zjistit změny vlastností

staticMetodu zpětného volání změněné vlastností lze zaregistrovat s vlastností s možností vazby zadáním propertyChanged parametru pro Xamarin_Forms static _BindableProperty_Create_System_String_System_Type_System_Type_System_Object_ Xamarin_Forms _BindingMode_ Xamarin_Forms _BindableProperty_ValidateValueDelegate_ Xamarin_Forms _BindableProperty_BindingPropertyChangedDelegate_ Xamarin_Forms _BindableProperty_BindingPropertyChangingDelegate_ Xamarin_Forms _BindableProperty_CoerceValueDelegate_ Xamarin_Forms _BindableProperty_CreateDefaultValueDelegate_ "data-LINKTYPE =" absolutní cestu ">BindableProperty.Create metoda. Zadaná metoda zpětného volání bude vyvolána při změně hodnoty vlastnosti BIND.

Následující příklad kódu ukazuje, jak EventName vlastnost Bind registruje OnEventNameChanged metodu jako metodu zpětného volání změněné vlastnosti:

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 je parametr použit k označení, která instance vlastnící třídy ohlásila změnu, a hodnoty dvou object parametrů představuje starou a novou hodnotu vlastnosti BIND.

Zpětná volání ověřování

staticMetodu zpětného volání ověřování lze zaregistrovat s vlastností s možností vazby zadáním validateValue parametru pro Xamarin_Forms static _BindableProperty_Create_System_String_System_Type_System_Type_System_Object_ Xamarin_Forms _BindingMode_ Xamarin_Forms _BindableProperty_ValidateValueDelegate_ Xamarin_Forms _BindableProperty_BindingPropertyChangedDelegate_ Xamarin_Forms _BindableProperty_BindingPropertyChangingDelegate_ Xamarin_Forms _BindableProperty_CoerceValueDelegate_ Xamarin_Forms _BindableProperty_CreateDefaultValueDelegate_ "data-LINKTYPE =" absolutní cestu ">BindableProperty.Create metoda. Zadaná metoda zpětného volání bude vyvolána, pokud je nastavena hodnota vlastnosti BIND.

Následující příklad kódu ukazuje, jak Angle vlastnost Bind registruje IsValidValue metodu jako metodu zpětného volání ověřová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);
}

Zpětná volání ověřování jsou k dispozici s hodnotou a měly by vracet, true Pokud je hodnota pro vlastnost platná, jinak false . Výjimka se vyvolá, pokud zpětné volání ověřování vrátí false , které by mělo být zpracováno vývojářem. Typické použití metody zpětného volání ověřování je omezením hodnot celých čísel nebo dvojitých hodnot, pokud je nastavena vlastnost Bind. Například IsValidValue Metoda kontroluje, zda je hodnota vlastnosti double v rozsahu od 0 do 360.

Převede zpětná volání hodnot

staticMetodu typu zpětného volání s vazbou lze zaregistrovat s vlastností s možností vazby zadáním coerceValue parametru pro Xamarin_Forms static _BindableProperty_Create_System_String_System_Type_System_Type_System_Object_ Xamarin_Forms _BindingMode_ Xamarin_Forms _BindableProperty_ValidateValueDelegate_ Xamarin_Forms _BindableProperty_BindingPropertyChangedDelegate_ Xamarin_Forms _BindableProperty_BindingPropertyChangingDelegate_ Xamarin_Forms _BindableProperty_CoerceValueDelegate_ Xamarin_Forms _BindableProperty_CreateDefaultValueDelegate_ "data-LINKTYPE =" absolutní cestu ">BindableProperty.Create metoda. Zadaná metoda zpětného volání bude vyvolána při změně hodnoty vlastnosti BIND.

Důležité

BindableObjectTyp má CoerceValue metodu, která může být volána k vynucení opakovaného vyhodnocení hodnoty svého BindableProperty argumentu, vyvoláním zpětného volání s funkcí převedeného hodnoty.

K vynucení přehodnocení vlastnosti s možností vazby při změně hodnoty vlastnosti se používají zpětná volání hodnot. Například zpětné volání typu "převedená hodnota" lze použít k zajištění, že hodnota jedné vlastnosti s možností vazby není větší než hodnota jiné vlastnosti s možností vazby.

Následující příklad kódu ukazuje, jak vlastnost s možností Angle vazby registruje CoerceAngle metodu jako metodu zpětného volání s funkcí převedenými na hodnotu:

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);
}

CoerceAngleMetoda kontroluje hodnotu MaximumAngle vlastnosti, a pokud Angle je hodnota vlastnosti větší než, je převedena na MaximumAngle hodnotu vlastnosti. Kromě toho platí, že pokud MaximumAngle vlastnost změní zpětné volání hodnoty, je vyvolána na Angle vlastnost voláním CoerceValue metody.

Vytvoření výchozí hodnoty pomocí Func

FuncLze použít k inicializaci výchozí hodnoty vlastnosti s možností vazby, 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));

defaultValueCreatorParametr je nastaven na Func , který vyvolá Xamarin_Forms defaultValueCreator _Device_GetNamedSize_ Xamarin_Forms _NamedSize_System_Type_ "data-LINKTYPE =" absolutní cesta ">Device.GetNamedSize metoda pro vrácení double , která představuje pojmenovanou velikost písma, která je použita na Label nativní platformě.