Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Not
Bu kitap 2016 baharında yayımlanmıştır ve o zamandan beri güncellenmemiştir. Kitapta değerli kalan çok şey vardır, ancak bazı malzemeler eskidir ve bazı konular artık tamamen doğru veya eksiksiz değildir.
Her C# programcısı C# özellikleri hakkında bilgi sahibidir. Özellikler bir küme erişimcisi ve/veya get erişimcisi içerir. Bunlar genellikle Ortak Dil Çalışma Zamanı için CLR özellikleri olarak adlandırılır.
Xamarin.Forms, sınıfı tarafından kapsüllenen ve sınıfı tarafından BindableProperty BindableObject desteklenen bağlanabilir özellik olarak adlandırılan gelişmiş özellik tanımını tanımlar. Bu sınıflar ilişkilidir ancak oldukça farklıdır: BindableProperty özelliğin kendisini tanımlamak için kullanılır; BindableObject bu, bağlanabilir özellikleri tanımlayan sınıflar için bir temel sınıf olması gibidir object .
Sınıf hiyerarşisi Xamarin.Forms
ClassHierarchy örneği, bir sınıf hiyerarşisini Xamarin.Forms görüntülemek ve bu hiyerarşide oynadığı BindableObject kritik rolü göstermek için yansımayı kullanır. BindableObject ve öğesinden Object türetilen üst sınıftır Element VisualElement . Bu, ve Viewiçin üst sınıfıdır Page ve için üst sınıftırLayout:
BindableObject ve BindableProperty'ye göz atma
Birçok CLR özelliğinden BindableObject türetilen sınıflarda bağlanabilir özellikler tarafından "yedeklendiği" söylenir. Örneğin, Text sınıfının özelliği Label bir CLR özelliğidir, ancak Label sınıfı aynı zamanda türünde BindablePropertyadlı TextProperty bir genel statik salt okunur alan tanımlar.
Bir uygulama, özelliğini normal olarak ayarlayabilir veya alabilir Label Text ya da bir bağımsız değişkenle Label.TextProperty tarafından BindableObject tanımlanan yöntemini çağırarak SetValue öğesini ayarlayabilirText. Benzer şekilde, bir uygulama yine bir Label.TextProperty bağımsız değişkenle yöntemini çağırarak özelliğinin GetValue değerini Text alabilir. Bu, PropertySettings örneği tarafından gösterilir.
Aslında, Text CLR özelliği tamamen statik özelliğiyle Label.TextProperty birlikte tarafından BindableObject tanımlanan ve GetValue yöntemleri kullanılarak SetValue uygulanır.
BindableObject ve BindableProperty aşağıdakiler için destek sağlayın:
- Özelliklere varsayılan değerler verme
- Geçerli değerlerini depolama
- Özellik değerlerini doğrulamak için mekanizmalar sağlama
- Tek bir sınıftaki ilgili özellikler arasında tutarlılığı koruma
- Özellik değişikliklerine yanıt verme
- Bir özellik değişmek üzereyken veya değiştiğinde bildirimleri tetikleme
- Veri bağlamayı destekleme
- Destekleyici stiller
- Dinamik kaynakları destekleme
Bağlanabilir bir özellik tarafından yedeklenen bir özellik değiştiğinde, BindableObject değiştirilen özelliği tanımlayan bir PropertyChanged olay tetikler. Özellik aynı değere ayarlandığında bu olay tetiklenmez.
Bazı özellikler bağlanabilir özellikler tarafından desteklenmez ve bazı Xamarin.Forms sınıflar (örneğin Span ), 'den BindableObjecttüretilmez. ve GetValue yöntemlerini tanımladığından SetValue BindableObject, yalnızca öğesinden BindableObject türetilen bir sınıf bağlanabilir özellikleri destekleyebilir.
' Span den BindableObjecttüretilmediğinden, özelliklerinden hiçbiri (örneğin Text , ) bağlanabilir bir özellik tarafından desteklenmez. Özelliğindeki bir DynamicResource ayarın Text Span önceki bölümdeki DynamicVsStatic örneğinde bir özel durum oluşturmasının nedeni budur. DynamicVsStaticCode örneği, tarafından Elementtanımlanan yöntemini kullanarak SetDynamicResource kodda dinamik kaynakların nasıl ayarlandığını gösterir. İlk bağımsız değişken türünde BindablePropertybir nesnesidir.
Benzer şekilde, SetBinding tarafından BindableObject tanımlanan yöntemin türünde BindablePropertyilk bağımsız değişkeni vardır.
Bağlanabilir özellikleri tanımlama
türünde BindablePropertystatik bir salt okunur alan oluşturmak için statik BindableProperty.Create yöntemini kullanarak kendi bağlanabilir özelliklerinizi tanımlayabilirsiniz.
Bu, Book.Toolkit kitaplığındaki Xamarin.Formssınıfında gösterilmiştir.AltLabel sınıfı öğesinden Label türetilir ve nokta cinsinden bir yazı tipi boyutu belirtmenize olanak tanır. PointSizedText örneğinde gösterilmiştir.
Yönteminin BindableProperty.Create dört bağımsız değişkeni gereklidir:
propertyName: özelliğin metin adı (CLR özellik adıyla aynı)returnType: CLR özelliğinin türüdeclaringType: özelliğini belirten sınıfın türüdefaultValue: özelliğin varsayılan değeri
defaultValue türünde objectolduğundan, derleyicinin varsayılan değerin türünü belirleyebilmesi gerekir. Örneğin, ise returnType doubledefaultValue değeri yalnızca 0 yerine 0,0 gibi bir değere ayarlanmalıdır; aksi takdirde tür uyuşmazlığı çalışma zamanında bir özel durum tetikler.
Ayrıca, bağlanabilir bir özelliğin şunları içermesi de çok yaygındır:
propertyChanged: özelliği değeri değiştirdiğinde çağrılan statik bir yöntem. İlk bağımsız değişken, özelliği değiştirilmiş olan sınıfın örneğidir.
için diğer bağımsız değişkenler BindableProperty.Create o kadar yaygın değildir:
defaultBindingMode: veri bağlama ile bağlantılı olarak kullanılır (Bölüm 16'da açıklandığı gibi). Veri bağlama)validateValue: Geçerli bir değer olup olmadığını denetlemek için bir geri çağırmapropertyChanging: özelliğin ne zaman değişmek üzere olduğunu belirtmek için bir geri çağırmacoerceValue: Bir küme değerini başka bir değere zorlamak için geri çağırmadefaultValueCreate: sınıfının örnekleri arasında paylaşılamayan varsayılan bir değer oluşturmak için bir geri çağırma (örneğin, bir koleksiyon)
Salt okunur bağlanabilir özellik
Bağlanabilir bir özellik salt okunur olabilir. Salt okunur bağlanabilir özellik oluşturmak için, türünde BindablePropertyKeyözel bir statik salt okunur alan tanımlamak için statik yöntemin BindableProperty.CreateReadOnly çağrılması gerekir.
Ardından, nesnesiyle aşırı SetValue yüklemeyi çağırmak için CLR özellik set accesor'ını BindablePropertyKey private tanımlayın. Bu, özelliğin sınıfın dışında ayarlanmasını engeller.
Bu, BaskervillesCount örneğinde kullanılan sınıfında gösterilmiştirCountedLabel.
