Bağımlılık Özelliği Meta Verisi
Windows Presentation Foundation (WPF) özellik sistemi, yansıma veya genel ortak dil çalışma zamanı (CLR) özellikleri aracılığıyla bir özellik hakkında bildirilebilenlerin ötesine geçen bir meta veri raporlama sistemi içerir. Bir bağımlılık özelliğinin meta verileri de bağımlılık özelliğini tanımlayan sınıf tarafından benzersiz olarak atanabilir, bağımlılık özelliği farklı bir sınıfa eklendiğinde değiştirilebilir ve bağımlılık özelliğini tanımlayan temel sınıftan devralan tüm türetilmiş sınıflar tarafından özel olarak geçersiz kılınabilir.
Ön koşullar
Bu konu başlığında, WPF sınıflarında var olan bağımlılık özelliklerinin tüketicisi açısından bağımlılık özelliklerini anladığınız ve Bağımlılık Özelliklerine Genel Bakış konusunu okuduğunuz varsayılır. Bu konudaki örnekleri takip etmek için XAML'yi de anlamanız ve WPF uygulamalarının nasıl yazılması gerektiğini bilmeniz gerekir.
Bağımlılık Özelliği Meta Verileri Nasıl Kullanılır?
Bağımlılık özelliği meta verileri, bağımlılık özelliğinin özelliklerini incelemek için sorgulanabilen bir nesne olarak bulunur. Bu meta verilere, belirli bir bağımlılık özelliğini işlediğinden özellik sistemi tarafından da sık sık erişilir. Bir bağımlılık özelliğinin meta veri nesnesi aşağıdaki bilgi türlerini içerebilir:
Bağımlılık özelliği için yerel değer, stil, devralma vb. başka bir değer belirlenemiyorsa, bağımlılık özelliği için varsayılan değer. Varsayılan değerlerin bağımlılık özellikleri için değerler atarken özellik sistemi tarafından kullanılan önceliğe nasıl katıldığını ayrıntılı bir şekilde tartışmak için bkz . Bağımlılık Özelliği Değeri Önceliği.
Sahip başına tür temelinde zorlama veya değişiklik bildirimi davranışlarını etkileyen geri çağırma uygulamalarına başvurular. Bu geri çağırmaların genellikle nonpublic erişim düzeyiyle tanımlandığına dikkat edin. Bu nedenle, başvurular izin verilen erişim kapsamınızda olmadığı sürece meta verilerden gerçek başvuruları almak genellikle mümkün değildir. Bağımlılık özelliği geri çağırmaları hakkında daha fazla bilgi için bkz . Bağımlılık Özelliği Geri Çağırmaları ve Doğrulama.
Söz konusu bağımlılık özelliğinin WPF çerçeve düzeyi özelliği olduğu kabul edilirse, meta veriler WPF çerçeve düzeyi düzen altyapısı ve özellik devralma mantığı gibi hizmetlerin bilgilerini ve durumunu raporlayan WPF çerçeve düzeyi bağımlılık özelliği özelliklerini içerebilir. Bağımlılık özelliği meta verilerinin bu yönü hakkında daha fazla bilgi için bkz . Framework Özellik Meta Verileri.
Meta veri API'leri
Özellik sistemi tarafından kullanılan meta veri bilgilerinin çoğunu bildiren tür sınıfıdır PropertyMetadata . Bağımlılık özellikleri özellik sistemine kaydedildiğinde isteğe bağlı olarak meta veri örnekleri belirtilir ve kendilerini sahip olarak ekleyen veya temel sınıf bağımlılık özelliği tanımından devraldıkları meta verileri geçersiz kılan ek türler için yeniden belirtilebilir. (Özellik kaydının meta verileri belirtmediği durumlarda, bu sınıf için varsayılan PropertyMetadata değerlerle bir varsayılan oluşturulur.) Kayıtlı meta veriler, bir örnekteki bağımlılık özelliğinden DependencyObject meta verileri alan çeşitli GetMetadata aşırı yüklemeleri çağırdığınızda döndürülürPropertyMetadata.
Ardından PropertyMetadata sınıfı, WPF çerçeve düzeyi sınıfları gibi mimari bölümler için daha özel meta veriler sağlamak üzere öğesinden türetilir. UIPropertyMetadata animasyon raporlaması ekler ve FrameworkPropertyMetadata önceki bölümde bahsedilen WPF çerçeve düzeyi özelliklerini sağlar. Bağımlılık özellikleri kaydedildiğinde, bu PropertyMetadata türetilmiş sınıflara kaydedilebilir. Meta veriler incelendiğinde, temel PropertyMetadata tür türetilmiş sınıflara dönüştürülebilir, böylece daha belirli özellikleri inceleyebilirsiniz.
Dekont
içinde FrameworkPropertyMetadata belirtilebilen özellik özellikleri bazen bu belgelerde "bayraklar" olarak adlandırılır. Bağımlılık özelliği kayıtlarında veya meta veri geçersiz kılmalarında kullanılmak üzere yeni meta veri örnekleri oluşturduğunuzda, bu değerleri bayrak düzeyinde sabit listesi FrameworkPropertyMetadataOptions kullanarak belirtir ve sonra numaralandırmanın muhtemelen birleştirilmiş değerlerini oluşturucuya FrameworkPropertyMetadata sağlarsınız. Ancak, bu seçenek özellikleri bir kez oluşturulurken, oluşturma sabit listesi değeri yerine bir FrameworkPropertyMetadata dizi Boole özelliği içinde kullanıma sunulur. Boole özellikleri, ilgilendiğiniz bilgileri almak için bayrak yönündeki bir numaralandırma değerine maske uygulamanızı gerektirmek yerine her koşullu değeri denetlemenizi sağlar. Oluşturucu, oluşturucu imzasının uzunluğunu makul tutmak için birleştirilmiş FrameworkPropertyMetadataOptions değerini kullanırken, gerçek olarak yapılan meta veriler meta verileri sorgulamayı daha sezgisel hale getirmek için ayrık özellikleri kullanıma sunar.
Meta Veriler Ne Zaman Geçersiz Kılınacak, Sınıf Ne Zaman Türetilir?
WPF özellik sistemi, bağımlılık özelliklerinin tamamen yeniden uygulanmasına gerek kalmadan bazı özelliklerini değiştirmeye yönelik özellikler oluşturmİştir. Bu, bağımlılık özelliği için belirli bir tür üzerinde mevcut olduğundan farklı bir özellik meta veri örneği oluşturarak gerçekleştirilir. Mevcut bağımlılık özelliklerinin çoğunun sanal özellikler olmadığını unutmayın, bu nedenle devralınan sınıflarda "yeniden uygulama" ifadesi yalnızca mevcut üyenin gölgelenmesiyle gerçekleştirilebilir.
Bir türdeki bağımlılık özelliği için etkinleştirmeye çalıştığınız senaryo, mevcut bağımlılık özelliklerinin özellikleri değiştirilerek gerçekleştirilemiyorsa, türetilmiş bir sınıf oluşturmak ve sonra türetilmiş sınıfınızda özel bir bağımlılık özelliği bildirmek gerekebilir. Özel bağımlılık özelliği WPF API'leri tarafından tanımlanan bağımlılık özellikleriyle aynı şekilde davranır. Özel bağımlılık özellikleri hakkında daha fazla ayrıntı için bkz . Özel Bağımlılık Özellikleri.
Geçersiz kılamayacağınız bir bağımlılık özelliğinin önemli özelliklerinden biri değer türüdür. Gereken yaklaşık davranışa sahip bir bağımlılık özelliğini devralıyorsanız, ancak bunun için farklı bir türe ihtiyacınız varsa, özel bir bağımlılık özelliği uygulamanız ve belki de özellikleri tür dönüştürmesi veya özel sınıfınızdaki başka bir uygulama aracılığıyla bağlamanız gerekir. Ayrıca, bu geri çağırma kendi meta verilerinde değil kayıt alanında mevcut olduğundan, var olan ValidateValueCallbackbir öğesini değiştiremezsiniz.
Mevcut Meta Verileri Değiştirme Senaryoları
Mevcut bir bağımlılık özelliğinin meta verileriyle çalışıyorsanız, bağımlılık özelliği meta verilerini değiştirmek için yaygın senaryolardan biri varsayılan değeri değiştirmektir. Özellik sistemi geri çağırmalarını değiştirmek veya eklemek daha gelişmiş bir senaryodur. Türetilmiş bir sınıf uygulamanızın bağımlılık özellikleri arasında farklı bağıntıları varsa bunu yapmak isteyebilirsiniz. Hem kod hem de bildirim temelli kullanımı destekleyen bir programlama modeline sahip olmanın koşullu özelliklerinden biri, özelliklerin herhangi bir sırada ayarlanmasını etkinleştirmesi gerektiğidir. Bu nedenle tüm bağımlı özelliklerin bağlam olmadan tam zamanında ayarlanması gerekir ve oluşturucuda bulunabilecek gibi bir ayar sırasının bilinmesine dayanamaz. Özellik sisteminin bu yönü hakkında daha fazla bilgi için bkz . Bağımlılık Özelliği Geri Çağırmaları ve Doğrulama. Doğrulama geri çağırmalarının meta verilerin bir parçası olmadığını unutmayın; bağımlılık özelliği tanımlayıcısının bir parçasıdır. Bu nedenle, doğrulama geri çağırmaları meta veriler geçersiz kılınarak değiştirilemez.
Bazı durumlarda, mevcut bağımlılık özelliklerinde WPF çerçeve düzeyi özellik meta veri seçeneklerini de değiştirmek isteyebilirsiniz. Bu seçenekler, WPF çerçeve düzeyi özellikleri hakkında bilinen bazı koşullu işlemleri düzen sistemi gibi diğer WPF çerçeve düzeyindeki işlemlere iletir. Seçeneklerin ayarlanması genellikle yalnızca yeni bir bağımlılık özelliği kaydedildiğinde yapılır, ancak bir veya AddOwner çağrısının OverrideMetadata parçası olarak WPF çerçeve düzeyi özellik meta verilerini değiştirmek de mümkündür. Kullanılacak belirli değerler ve daha fazla bilgi için bkz . Framework Özellik Meta Verileri. Yeni kaydedilen bağımlılık özelliği için bu seçeneklerin nasıl ayarlanması gerektiğine ilişkin daha fazla bilgi için bkz . Özel Bağımlılık Özellikleri.
Meta Verileri Geçersiz Kılma
Meta verileri geçersiz kılmanın amacı, öncelikle türünüzde var olan bağımlılık özelliğine uygulanan çeşitli meta veri türetilmiş davranışları değiştirme fırsatına sahip olmaktır. Bunun nedenleri Meta Veriler bölümünde daha ayrıntılı olarak açıklanmıştır. Bazı kod örnekleri de dahil olmak üzere daha fazla bilgi için bkz . Bağımlılık Özelliği için Meta Verileri Geçersiz Kılma.
Özellik meta verileri, kayıt çağrısı (Register sırasında bir bağımlılık özelliği için sağlanabilir. Ancak çoğu durumda, bu bağımlılık özelliğini devraldığında sınıfınız için türe özgü meta veriler sağlamak isteyebilirsiniz. Yöntemini çağırarak OverrideMetadata bunu yapabilirsiniz. WPF API'lerinden bir örnek için sınıfı, FrameworkElement bağımlılık özelliğini ilk Focusable kaydeden türdür. Control Ancak sınıfı, bağımlılık özelliğinin meta verilerini geçersiz kılarak kendi ilk varsayılan değerini sağlar, değerini olarak false
true
değiştirir ve aksi takdirde özgün Focusable uygulamayı yeniden kullanır.
Meta verileri geçersiz kıldığınızda, farklı meta veri özellikleri birleştirilir veya değiştirilir.
PropertyChangedCallback birleştirilir. Yeni PropertyChangedCallbackbir eklerseniz, bu geri arama meta verilerde depolanır. Geçersiz kılmada bir PropertyChangedCallback belirtmezseniz, değeri PropertyChangedCallback meta verilerde bunu belirten en yakın atadan bir başvuru olarak yükseltilir.
için PropertyChangedCallback gerçek özellik sistemi davranışı, hiyerarşideki tüm meta veri sahiplerine yönelik uygulamaların saklanması ve bir tabloya eklenmesi ve özellik sistemi tarafından yürütme sırasının en çok türetilmiş sınıfın geri çağırmalarının ilk olarak çağrılması olmasıdır.
DefaultValue değiştirilir. Geçersiz kılmada belirtmezseniz DefaultValue değeri DefaultValue , meta verilerde bunu belirten en yakın atadan gelir.
CoerceValueCallback uygulamaları değiştirilir. Yeni CoerceValueCallbackbir eklerseniz, bu geri arama meta verilerde depolanır. Geçersiz kılmada bir CoerceValueCallback belirtmezseniz, değeri CoerceValueCallback meta verilerde bunu belirten en yakın atadan bir başvuru olarak yükseltilir.
Özellik sistemi davranışı, yalnızca CoerceValueCallback anlık meta verilerdeki öğesinin çağrılmasıdır. Hiyerarşideki diğer CoerceValueCallback uygulamalara başvuru korunmaz.
Bu davranış tarafından Mergeuygulanır ve türetilmiş meta veri sınıflarında geçersiz kılınabilir.
Ekli Özellik Meta Verilerini Geçersiz Kılma
WPF'de, ekli özellikler bağımlılık özellikleri olarak uygulanır. Bu, tek tek sınıfların geçersiz kılabileceği özellik meta verilerine de sahip oldukları anlamına gelir. WPF'deki ekli bir özelliğin kapsam belirleme konuları genellikle herhangi birinin DependencyObject üzerinde bir ekli özellik ayarlanabileceğidir. Bu nedenle, herhangi bir DependencyObject türetilmiş sınıf, sınıfın bir örneğinde ayarlanabileceği için ekli herhangi bir özellik için meta verileri geçersiz kılabilir. Varsayılan değerleri, geri çağırmaları veya WPF çerçeve düzeyi özellik raporlama özelliklerini geçersiz kılabilirsiniz. Ekli özellik sınıfınızın bir örneğinde ayarlanırsa, bu geçersiz kılma özelliği meta veri özellikleri uygulanır. Örneğin, geçersiz kılma değerinizin sınıfınızın örneklerinde ekli özelliğin değeri olarak rapor edilmesi için varsayılan değeri geçersiz kılabilirsiniz.
Dekont
Inherits özelliği ekli özelliklerle ilgili değildir.
Mevcut Bağımlılık Özelliğinin Sahibi Olarak Sınıf Ekleme
Bir sınıf, yöntemini kullanarak kendisini zaten kaydedilmiş bir bağımlılık özelliğinin AddOwner sahibi olarak ekleyebilir. Bu, sınıfın başlangıçta farklı bir tür için kaydedilmiş bir bağımlılık özelliğini kullanmasını sağlar. Ekleme sınıfı genellikle ilk olarak bu bağımlılık özelliğini sahip olarak kaydeden türün türetilmiş bir sınıfı değildir. Bu, sınıfınızın ve türetilmiş sınıflarının özgün sahip sınıfı ve ekleme sınıfı aynı gerçek sınıf hiyerarşisinde olmadan bağımlılık özelliği uygulamasını "devralmasını" sağlar. Ayrıca, ekleme sınıfı (ve türetilen tüm sınıflar da) özgün bağımlılık özelliği için türe özgü meta veriler sağlayabilir.
Özellik sistemi yardımcı programı yöntemleri aracılığıyla kendisini sahip olarak eklemenin yanı sıra, ekleme sınıfı, bağımlılık özelliğinin] hem koda hem de işaretlemeye maruz kalarak özellik sisteminde tam bir katılımcı olmasını sağlamak için kendisine ek genel üyeler bildirmelidir. Mevcut bağımlılık özelliğini ekleyen bir sınıf, bu bağımlılık özelliği için nesne modelini kullanıma sunmayla, yeni bir özel bağımlılık özelliğini tanımlayan sınıfla aynı sorumluluklara sahiptir. Kullanıma sunan ilk üye bir bağımlılık özelliği tanımlayıcı alanıdır. Bu alan, çağrının dönüş değerine AddOwner atanan türünde DependencyPropertybir public static readonly
alan olmalıdır. Tanımlayacak ikinci üye ortak dil çalışma zamanı (CLR) "sarmalayıcı" özelliğidir. Sarmalayıcı, kodda bağımlılık özelliğinizi işlemeyi çok daha kullanışlı hale getirir (her seferinde çağrı yapmaktan SetValue kaçınabilir ve bu çağrıyı sarmalayıcının kendisinde yalnızca bir kez yapabilirsiniz). Sarmalayıcı, özel bağımlılık özelliğini kaydederken nasıl uygulanacağıyla aynı şekilde uygulanır. Bağımlılık özelliğini uygulama hakkında daha fazla bilgi için bkz . Özel Bağımlılık Özellikleri ve Bağımlılık Özelliği için Sahip Türü Ekleme.
AddOwner ve Ekli Özellikler
Sahip sınıfı tarafından ekli özellik olarak tanımlanan bir bağımlılık özelliğini çağırabilirsiniz AddOwner . Bunu yapmanın nedeni genellikle daha önce eklenmiş olan özelliği ekli olmayan bir bağımlılık özelliği olarak kullanıma sunmadır. Ardından dönüş değerini bağımlılık özellik tanımlayıcısı olarak kullanılacak bir public static readonly
alan olarak kullanıma sunarsınız AddOwner ve uygun "sarmalayıcı" özelliklerini tanımlarsınız, böylece özellik üyeler tablosunda görünür ve sınıfınızda ekli olmayan bir özellik kullanımını destekler.
Ayrıca bkz.
.NET Desktop feedback