Xamarin.Forms Bağlanabilir Özellikler
Bağlanabilir özellikler, bir özelliği alanla yedeklemek yerine bir özelliği türle BindableProperty
yedekleyerek CLR özellik işlevselliğini genişletir. Bağlanabilir özelliklerin amacı, üst-alt ilişkiler aracılığıyla ayarlanan veri bağlamayı, stilleri, şablonları ve değerleri destekleyen bir özellik sistemi sağlamaktır. Ayrıca, bağlanabilir özellikler varsayılan değerler, özellik değerlerinin doğrulanması ve özellik değişikliklerini izleyen geri çağırmalar sağlayabilir.
Özellikler, aşağıdaki özelliklerden birini veya daha fazlasını desteklemek için bağlanabilir özellikler olarak uygulanmalıdır:
- Veri bağlama için geçerli bir hedef özelliği olarak davranma.
- Özelliği bir stil aracılığıyla ayarlama.
- Özelliğin türü için varsayılandan farklı bir varsayılan özellik değeri sağlama.
- özelliğinin değeri doğrulanıyor.
- özellik değişikliklerini izleme.
Bağlanabilir özelliklere Xamarin.Forms örnek olarak Label.Text
, Button.BorderRadius
ve StackLayout.Orientation
verilebilir. Her bağlanabilir özellik, aynı sınıfta kullanıma sunulan ve bağlanabilir özelliğin tanımlayıcısı olan karşılık gelen public static readonly
türde BindableProperty
bir alana sahiptir. Örneğin, özelliği için karşılık gelen bağlanabilir özellik tanımlayıcısı Label.Text
şeklindedir Label.TextProperty
.
Bağlanabilir özellik oluşturma
Bağlanabilir özellik oluşturma işlemi aşağıdaki gibidir:
- Yöntem aşırı yüklemelerinden
BindableProperty.Create
biriyle birBindableProperty
örnek oluşturun. - Örnek için
BindableProperty
özellik erişimcilerini tanımlayın.
Tüm BindableProperty
örneklerin kullanıcı arabirimi iş parçacığında oluşturulması gerekir. Bu, yalnızca ui iş parçacığında çalışan kodun bağlanabilir bir özelliğin değerini alabildiği veya ayarlayabildiği anlamına gelir. Ancak, BindableProperty
yöntemiyle kullanıcı arabirimi iş parçacığına sıralanarak örneklere diğer iş parçacıklarından Device.BeginInvokeOnMainThread
erişilebilir.
Özellik oluşturma
Örnek BindableProperty
oluşturmak için, içeren sınıfın sınıfından BindableObject
türetilmesi gerekir. Ancak sınıf, BindableObject
sınıf hiyerarşisinde yüksek olduğundan, kullanıcı arabirimi işlevselliği için kullanılan sınıfların çoğu bağlanabilir özellikleri destekler.
türündeki bir özellik bildirilerek bağlanabilir bir public static readonly
özellik BindableProperty
oluşturulabilir. Bağlanabilir özellik, yöntem aşırı yüklemelerinden BindableProperty.Create
birinin döndürülen değerine ayarlanmalıdır. Bildirimi, türetilmiş sınıfın gövdesi içinde BindableObject
, ancak tüm üye tanımlarının dışında olmalıdır.
En azından, oluştururken aşağıdaki parametrelerle birlikte bir BindableProperty
tanımlayıcı belirtilmelidir:
BindableProperty
öğesinin adı.- Özelliğin türü.
- Sahip olan nesnenin türü.
- Özelliği için varsayılan değer. Bu, özelliğin ayarsız olduğunda her zaman belirli bir varsayılan değer döndürmesini sağlar ve özelliğin türü için varsayılan değerden farklı olabilir. Yöntemi bağlanabilir özelliğinde
ClearValue
çağrıldığında varsayılan değer geri yüklenir.
Önemli
Bağlanabilir özelliklerin adlandırma kuralı, bağlanabilir özellik tanımlayıcısının yönteminde Create
belirtilen özellik adıyla eşleşmesi ve sonuna "Özellik" eklenmesi gerektiğidir.
Aşağıdaki kod, tanımlayıcı ve gerekli dört parametre için değerler içeren bağlanabilir özellik örneğini gösterir:
public static readonly BindableProperty EventNameProperty =
BindableProperty.Create ("EventName", typeof(string), typeof(EventToCommandBehavior), null);
Bu, türünde string
adlı EventNameProperty
bir BindableProperty
örnek oluşturur. özelliği sınıfına EventToCommandBehavior
aittir ve varsayılan değerine null
sahiptir.
İsteğe bağlı olarak, örnek BindableProperty
oluştururken aşağıdaki parametreler belirtilebilir:
- Bağlama modu. Bu, özellik değeri değişikliklerinin yayılacağı yönü belirtmek için kullanılır. Varsayılan bağlama modunda, değişiklikler kaynaktan hedefe yayılır.
- Özellik değeri ayarlandığında çağrılacak bir doğrulama temsilcisi. Daha fazla bilgi için bkz . Doğrulama geri çağırmaları.
- Özellik değeri değiştiğinde çağrılacak bir özellik değiştirme temsilcisi. Daha fazla bilgi için bkz . Özellik değişikliklerini algılama.
- Özellik değeri değiştirildiğinde çağrılacak temsilciyi değiştiren özellik. Bu temsilci, değiştirilen özellik temsilcisiyle aynı imzaya sahip.
- Özellik değeri değiştiğinde çağrılacak bir zorlama değeri temsilcisi. Daha fazla bilgi için bkz . Coerce değeri geri çağırmaları.
Func
Varsayılan özellik değerini başlatmak için kullanılan bir. Daha fazla bilgi için bkz . Func ile varsayılan değer oluşturma.
Erişimci oluşturma
Özellik erişimcileri, bağlanabilir bir özelliğe erişmek için özellik söz dizimini kullanmak için gereklidir. Erişimci, Get
karşılık gelen bağlanabilir özelliğinde bulunan değeri döndürmelidir. Bu, yöntemini çağırarak GetValue
, değerin alınacağı bağlanabilir özellik tanımlayıcısını geçirerek ve ardından sonucu gerekli türe geçirerek elde edilebilir. Erişimci, Set
karşılık gelen bağlanabilir özelliğin değerini ayarlamalıdır. Bu, yöntemi çağrılarak SetValue
, değerin ayarlanacağı bağlanabilir özellik tanımlayıcısı ve ayarlanacak değer geçirilerek gerçekleştirilebilir.
Aşağıdaki kod örneği, bağlanabilir özelliğin EventName
erişimcilerini gösterir:
public string EventName
{
get { return (string)GetValue (EventNameProperty); }
set { SetValue (EventNameProperty, value); }
}
Bağlanabilir özellik kullanma
Bağlanabilir bir özellik oluşturulduktan sonra XAML veya koddan kullanılabilir. XAML'de bu, clr ad alanı adını belirten ad alanı bildirimi ve isteğe bağlı olarak bir derleme adı ile bir ön ek ile bir ad alanı bildirilerek elde edilir. Daha fazla bilgi için bkz . XAML Ad Alanları.
Aşağıdaki kod örneği, özel türe başvuran uygulama koduyla aynı derleme içinde tanımlanan bağlanabilir özellik içeren özel bir tür için XAML ad alanını gösterir:
<ContentPage ... xmlns:local="clr-namespace:EventToCommandBehavior" ...>
...
</ContentPage>
Ad alanı bildirimi, aşağıdaki XAML kod örneğinde gösterildiği gibi bağlanabilir özellik ayarlanırken EventName
kullanılır:
<ListView ...>
<ListView.Behaviors>
<local:EventToCommandBehavior EventName="ItemSelected" ... />
</ListView.Behaviors>
</ListView>
Eşdeğer C# kodu aşağıdaki kod örneğinde gösterilmiştir:
var listView = new ListView ();
listView.Behaviors.Add (new EventToCommandBehavior
{
EventName = "ItemSelected",
...
});
Gelişmiş senaryolar
Örnek oluştururken BindableProperty
, gelişmiş bağlanabilir özellik senaryolarını etkinleştirmek için ayarlanabilen bir dizi isteğe bağlı parametre vardır. Bu bölümde bu senaryolar incelanmıştır.
Özellik değişikliklerini algılama
static
Özellik tarafından değiştirilen geri çağırma yöntemi, yöntemin BindableProperty.Create
parametresi belirtilerek propertyChanged
bağlanabilir bir özelliğe kaydedilebilir. Belirtilen geri çağırma yöntemi, bağlanabilir özelliğin değeri değiştiğinde çağrılır.
Aşağıdaki kod örneğinde, bindable özelliğinin EventName
yöntemi özellik değiştirmeli geri çağırma yöntemi olarak nasıl kaydeddiği OnEventNameChanged
gösterilmektedir:
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
}
Özellik tarafından değiştirilen geri çağırma yönteminde BindableObject
, sahip olan sınıfın hangi örneğinin değişiklik bildirdiğini belirtmek için parametresi kullanılır ve iki object
parametrenin değerleri bindable özelliğinin eski ve yeni değerlerini temsil eder.
Doğrulama geri çağırmaları
Doğrulama static
geri çağırma yöntemi, yöntemin BindableProperty.Create
parametresi belirtilerek validateValue
bağlanabilir bir özelliğe kaydedilebilir. Bindable özelliğinin değeri ayarlandığında belirtilen geri çağırma yöntemi çağrılır.
Aşağıdaki kod örneğinde bindable özelliğinin Angle
yöntemi doğrulama geri çağırma yöntemi olarak nasıl kaydeddiği IsValidValue
gösterilmektedir:
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);
}
Doğrulama geri çağırmaları bir değerle sağlanır ve değer özelliği için geçerliyse döndürülmelidir true
, aksi takdirde false
. Bir doğrulama geri çağırması döndürürse false
, geliştirici tarafından işlenmesi gereken bir özel durum oluşturulur. Doğrulama geri çağırma yönteminin tipik bir kullanımı, bağlanabilir özellik ayarlandığında tamsayıların veya çiftlerin değerlerini kısıtlamaktır. Örneğin, IsValidValue
yöntemi özellik değerinin 0 ile 360 arasında bir double
olup olmadığını denetler.
Zorlama değeri geri çağırmaları
Bir static
zorlama değeri geri çağırma yöntemi, yöntemin BindableProperty.Create
parametresi belirtilerek coerceValue
bağlanabilir bir özelliğe kaydedilebilir. Belirtilen geri çağırma yöntemi, bağlanabilir özelliğin değeri değiştiğinde çağrılır.
Önemli
türü, BindableObject
zorlayıcı değeri geri çağırma yoluyla bağımsız değişkeninin değerinin BindableProperty
yeniden değerlendirilmesini zorlamak için çağrılabilen bir CoerceValue
yönteme sahiptir.
Zorlayıcı değer geri çağırmaları, özelliğin değeri değiştiğinde bağlanabilir bir özelliğin yeniden değerlendirilmesini zorlamak için kullanılır. Örneğin, bir zorlayıcı değer geri çağırma, bir bağlanabilir özelliğin değerinin başka bir bağlanabilir özelliğin değerinden büyük olmadığından emin olmak için kullanılabilir.
Aşağıdaki kod örneğinde, bindable özelliğinin Angle
yöntemi bir zorlama değeri geri çağırma yöntemi olarak nasıl kaydettirdiği CoerceAngle
gösterilmektedir:
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);
}
CoerceAngle
yöntemi özelliğin MaximumAngle
değerini denetler ve özellik değeri ondan büyükseAngle
, değeri özellik değerine zorlamalıMaximumAngle
. Ayrıca, özelliği değiştirdiğinde MaximumAngle
, yöntemi çağrılarak özelliğinde Angle
zorlama değeri geri çağırması çağrılır CoerceValue
.
Func ile varsayılan değer oluşturma
aşağıdaki Func
kod örneğinde gösterildiği gibi, bağlanabilir bir özelliğin varsayılan değerini başlatmak için kullanılabilir:
public static readonly BindableProperty SizeProperty =
BindableProperty.Create ("Size", typeof(double), typeof(HomePage), 0.0,
defaultValueCreator: bindable => Device.GetNamedSize (NamedSize.Large, (Label)bindable));
defaultValueCreator
parametresi, yerel platformda Device.GetNamedSize
kullanılan yazı tipinin adlandırılmış boyutunu temsil eden bir double
döndürmek için yöntemini çağıran bir Label
olarak ayarlanırFunc
.