Özel Bağımlılık Özellikleri

Bu konu başlığında, Windows Presentation Foundation (WPF) uygulama geliştiricilerinin ve bileşen yazarlarının özel bağımlılık özelliği oluşturmak istemesinin nedenleri açıklanır ve uygulama adımlarının yanı sıra özelliğin performansını, kullanılabilirliğini veya çok yönlülüğünü geliştirebilecek bazı uygulama seçenekleri açıklanır.

Ö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 Nedir?

Stil oluşturmayı, veri bağlamayı, devralmayı, animasyonları ve varsayılan değerleri desteklemek için ortak dil çalışma zamanı (CLR) özelliğini bağımlılık özelliği olarak uygulayarak etkinleştirebilirsiniz. Bağımlılık özellikleri, yöntemini (veya RegisterReadOnly) çağırarak Register WPF özellik sistemiyle kaydedilen ve bir DependencyProperty tanımlayıcı alanı tarafından yedeklenen özelliklerdir. Bağımlılık özellikleri yalnızca türler tarafından DependencyObject kullanılabilir, ancak DependencyObject WPF sınıf hiyerarşisinde oldukça yüksektir, bu nedenle WPF'de kullanılabilen sınıfların çoğu bağımlılık özelliklerini destekleyebilir. Bağımlılık özellikleri ve bu SDK'da bunları tanımlamak için kullanılan terim ve kuralların bazıları hakkında daha fazla bilgi için bkz . Bağımlılık Özelliklerine Genel Bakış.

Bağımlılık Özellikleri Örnekleri

WPF sınıflarında Background uygulanan bağımlılık özelliklerine örnek olarak özelliği, Width özelliği ve özelliği verilebilir.Text Bir sınıf tarafından sunulan her bağımlılık özelliğinin, aynı sınıfta kullanıma sunulan türüne DependencyProperty karşılık gelen bir genel statik alanı vardır. Bu, bağımlılık özelliğinin tanımlayıcısıdır. Tanımlayıcı bir kural kullanılarak adlandırılır: bağımlılık özelliğinin adı ve sonuna dize Property eklenmiştir. Örneğin, özelliğine karşılık gelen DependencyProperty tanımlayıcı alanı şeklindedirBackgroundProperty.Background Tanımlayıcı, bağımlılık özelliği hakkındaki bilgileri kaydedildiği gibi depolar ve daha sonra tanımlayıcı daha sonra bağımlılık özelliğiyle ilgili diğer işlemler için çağrılması SetValuegibi kullanılır.

Bağımlılık Özelliklerine Genel Bakış'ta belirtildiği gibi, WPF'deki tüm bağımlılık özellikleri (ekli özelliklerin çoğu hariç) "sarmalayıcı" uygulaması nedeniyle CLR özellikleridir. Bu nedenle, koddan, sarmalayıcıları diğer CLR özelliklerini kullandığınız şekilde tanımlayan CLR erişimcilerini çağırarak bağımlılık özelliklerini alabilir veya ayarlayabilirsiniz. Yerleşik bağımlılık özelliklerinin tüketicisi olarak, genellikle temel alınan özellik sistemine bağlantı noktası olan ve SetValueyöntemlerini GetValue kullanmazsınızDependencyObject. Bunun yerine, CLR özelliklerinin mevcut uygulaması, tanımlayıcı alanını uygun şekilde kullanarak özelliğin ve sarmalayıcı uygulamaları içinde get ve olarak zaten çağrılır GetValueSetValue.set Özel bağımlılık özelliğini kendiniz uyguluyorsanız sarmalayıcıyı benzer bir şekilde tanımlarsınız.

Bağımlılık Özelliğini Ne Zaman Uygulamalısınız?

Bir sınıf üzerinde bir özellik uyguladığınızda, sınıfınız öğesinden DependencyObjecttüretilirse, özelliğinizi bir tanımlayıcıyla yedekleme ve böylece bunu bir DependencyProperty bağımlılık özelliği yapma seçeneğiniz vardır. Özelliğinizin bağımlılık özelliği olması her zaman gerekli veya uygun değildir ve senaryo gereksinimlerinize bağlıdır. Bazen, özelliğinizi özel bir alanla yedeklemenin tipik tekniği yeterlidir. Ancak, özelliğinizin aşağıdaki WPF özelliklerinden birini veya daha fazlasını desteklemesini istediğinizde, özelliğinizi bağımlılık özelliği olarak uygulamanız gerekir:

  • Özelliğinizin bir stilde ayarlanabilir olmasını istiyorsunuz. Daha fazla bilgi için bkz . Stil oluşturma ve Şablon Oluşturma.

  • Özelliğinizin veri bağlamayı desteklemesini istiyorsunuz. Veri bağlama bağımlılık özellikleri hakkında daha fazla bilgi için bkz . İki Denetimin Özelliklerini Bağlama.

  • Özelliğinizin dinamik kaynak başvurusuyla ayarlanabilir olmasını istiyorsunuz. Daha fazla bilgi için bkz . XAML Kaynakları.

  • Öğe ağacındaki bir üst öğeden bir özellik değerini otomatik olarak devralmak istiyorsunuz. Bu durumda, CLR erişimi için bir özellik sarmalayıcısı da oluştursanız bile yöntemine RegisterAttached kaydolun. Daha fazla bilgi için bkz . Özellik Değeri Devralma.

  • Mülkünüzün düşünülebilir olmasını istiyorsunuz. Daha fazla bilgi için bkz. Animasyona Genel Bakış.

  • Özelliğin önceki değeri özellik sistemi, ortam veya kullanıcı tarafından yapılan eylemlerle değiştirildiğinde ya da stilleri okuyup kullanarak özellik sisteminin raporlamasını istiyorsunuz. Özelliğiniz, özellik meta verilerini kullanarak özellik sistemi özellik değerinizin kesin olarak değiştirildiğini her belirlediği her seferinde çağrılacak bir geri çağırma yöntemi belirtebilir. İlgili kavram, özellik değeri zorlamasıdır. Daha fazla bilgi için bkz . Bağımlılık Özelliği Geri Çağırmaları ve Doğrulama.

  • Bir özellik değerini değiştirmenin düzen sisteminin bir öğenin görsellerini yeniden derlemesini gerektirip gerekmediğini raporlama gibi WPF işlemleri tarafından da kullanılan yerleşik meta veri kurallarını kullanmak istiyorsunuz. Ya da türetilmiş sınıfların varsayılan değer gibi meta veri tabanlı özellikleri değiştirebilmesi için meta veri geçersiz kılmalarını kullanabilmek istiyorsunuz.

  • Özel denetimin özelliklerinin Özellikler penceresi düzenleme gibi Visual Studio WPF Tasarım Aracı desteği almasını istiyorsunuz. Daha fazla bilgi için bkz . Denetim Yazmaya Genel Bakış.

Bu senaryoları incelediğinizde, tamamen yeni bir özellik uygulamak yerine mevcut bir bağımlılık özelliğinin meta verilerini geçersiz kılarak senaryonuza ulaşıp ulaşamayacağınızı da göz önünde bulundurmanız gerekir. Meta veri geçersiz kılmanın pratik olup olmadığı senaryonuza ve bu senaryonun mevcut WPF bağımlılık özelliklerinde ve sınıflarında uygulamaya ne kadar yakın olduğuna bağlıdır. Meta verileri mevcut özelliklerde geçersiz kılma hakkında daha fazla bilgi için bkz . Bağımlılık Özelliği Meta Verileri.

Bağımlılık Özelliği Tanımlama Denetim Listesi

Bağımlılık özelliğinin tanımlanması dört ayrı kavramdan oluşur. Bu kavramlardan bazıları uygulamada tek satır kod olarak birleştirildiğinden, bu kavramlar mutlaka katı yordam adımları değildir:

  • (İsteğe bağlı) Bağımlılık özelliği için özellik meta verileri oluşturun.

  • Özellik adını özellik sistemine kaydedin ve bir sahip türü ve özellik değerinin türünü belirtin. Ayrıca, kullanılıyorsa özellik meta verilerini belirtin.

  • Tanımlayıcıyı DependencyProperty sahip türünde bir publicstaticreadonly alan olarak tanımlayın.

  • Adı bağımlılık özelliğinin adıyla eşleşen bir CLR "sarmalayıcı" özelliği tanımlayın. ClR "sarmalayıcı" özelliğinin get ve set erişimcilerini uygulayarak onu destekleyen bağımlılık özelliğine bağlanın.

Özelliği Özellik Sistemine Kaydetme

Özelliğinizin bağımlılık özelliği olması için, bu özelliği özellik sistemi tarafından tutulan bir tabloya kaydetmeniz ve daha sonraki özellik sistemi işlemleri için niteleyici olarak kullanılan benzersiz bir tanımlayıcı vermeniz gerekir. Bu işlemler iç işlemler veya kendi kod çağıran özellik sistemi API'leriniz olabilir. özelliğini kaydetmek için yöntemini sınıfınızın gövdesinde (sınıfın içinde, ancak üye tanımlarının dışında) çağırırsınız Register . Tanımlayıcı alanı, dönüş değeri olarak yöntem çağrısı tarafından Register da sağlanır. Çağrının Register diğer üye tanımları dışında yapılmasının nedeni, sınıfınızın birreadonlypublicstaticparçası olarak tür DependencyProperty alanı atamak ve oluşturmak için bu dönüş değerini kullanmanızdır. Bu alan, bağımlılık özelliğinizin tanımlayıcısı olur.

public static readonly DependencyProperty AquariumGraphicProperty = DependencyProperty.Register(
  "AquariumGraphic",
  typeof(Uri),
  typeof(AquariumObject),
  new FrameworkPropertyMetadata(null,
      FrameworkPropertyMetadataOptions.AffectsRender,
      new PropertyChangedCallback(OnUriChanged)
  )
);
Public Shared ReadOnly AquariumGraphicProperty As DependencyProperty = DependencyProperty.Register("AquariumGraphic", GetType(Uri), GetType(AquariumObject), New FrameworkPropertyMetadata(Nothing, FrameworkPropertyMetadataOptions.AffectsRender, New PropertyChangedCallback(AddressOf OnUriChanged)))

Bağımlılık Özelliği Adı Kuralları

İstisnai durumlar dışında izlemeniz gereken bağımlılık özellikleriyle ilgili belirlenmiş adlandırma kuralları vardır.

Bağımlılık özelliğinin kendisi, ilk parametresi Registerolarak verilen bu örnekteki gibi "AquariumGraphic" adlı temel bir ada sahip olacaktır. Bu ad her kayıt türü içinde benzersiz olmalıdır. Temel türler aracılığıyla devralınan bağımlılık özellikleri zaten kayıt türünün parçası olarak kabul edilir; devralınan özelliklerin adları yeniden kaydedilemez. Ancak, bu bağımlılık özelliği devralınmadığında bile bağımlılık özelliğinin sahibi olarak bir sınıf ekleme tekniği vardır; Ayrıntılar için bkz . Bağımlılık Özelliği Meta Verileri.

Tanımlayıcı alanını oluşturduğunuzda, bu alanı kaydettiğiniz özelliğin adına ve son ekine Propertygöre adlandırın. Bu alan, bağımlılık özelliğinin tanımlayıcısıdır ve daha sonra sarmalayıcılarda, kendi kodunuzla, izin ettiğiniz herhangi bir dış kod erişimiyle, özellik sistemi tarafından ve GetValue potansiyel olarak XAML işlemcileri tarafından özelliğe başka kod erişimiyle, sarmalayıcılarda yapacağınız ve çağrıları için SetValue giriş olarak kullanılır.

Dekont

Sınıf gövdesinde bağımlılık özelliğini tanımlamak tipik bir uygulamadır, ancak sınıf statik oluşturucusunda bir bağımlılık özelliği tanımlamak da mümkündür. Bağımlılık özelliğini başlatmak için birden fazla kod satırına ihtiyacınız varsa bu yaklaşım mantıklı olabilir.

"Sarmalayıcı" Uygulama

Sarmalayıcı uygulamanız uygulamada ve SetValueset uygulamada çağırmalıdır getGetValue (özgün kayıt çağrısı ve alanı burada netlik için de gösterilir).

Olağanüstü durumlar dışında, sarmalayıcı uygulamalarınız sırasıyla yalnızca GetValue ve SetValue eylemlerini gerçekleştirmelidir. Bunun nedeni XAML Yükleme ve Bağımlılık Özellikleri konusunda ele alınmıştır.

WPF sınıflarında sağlanan tüm mevcut genel bağımlılık özellikleri bu basit sarmalayıcı uygulama modelini kullanır; bağımlılık özelliklerinin çalışma karmaşıklığının çoğu doğal olarak özellik sisteminin bir davranışıdır veya özellik meta verileri aracılığıyla zorlama veya özellik değişikliği geri çağırmaları gibi diğer kavramlar aracılığıyla uygulanır.


public static readonly DependencyProperty AquariumGraphicProperty = DependencyProperty.Register(
  "AquariumGraphic",
  typeof(Uri),
  typeof(AquariumObject),
  new FrameworkPropertyMetadata(null,
      FrameworkPropertyMetadataOptions.AffectsRender,
      new PropertyChangedCallback(OnUriChanged)
  )
);
public Uri AquariumGraphic
{
  get { return (Uri)GetValue(AquariumGraphicProperty); }
  set { SetValue(AquariumGraphicProperty, value); }
}

Public Shared ReadOnly AquariumGraphicProperty As DependencyProperty = DependencyProperty.Register("AquariumGraphic", GetType(Uri), GetType(AquariumObject), New FrameworkPropertyMetadata(Nothing, FrameworkPropertyMetadataOptions.AffectsRender, New PropertyChangedCallback(AddressOf OnUriChanged)))
Public Property AquariumGraphic() As Uri
    Get
        Return CType(GetValue(AquariumGraphicProperty), Uri)
    End Get
    Set(ByVal value As Uri)
        SetValue(AquariumGraphicProperty, value)
    End Set
End Property

Yine kural gereği sarmalayıcı özelliğinin adı seçilen adla aynı olmalı ve özelliği kaydeden çağrının Register ilk parametresi olarak verilmelidir. Özelliğiniz kurala uymuyorsa, bunun tüm olası kullanımları devre dışı bırakması gerekmez, ancak birkaç önemli sorunla karşılaşırsınız:

  • Stillerin ve şablonların bazı yönleri çalışmaz.

  • Çoğu araç ve tasarımcı, XAML'yi düzgün bir şekilde seri hale getirmek veya özellik başına tasarımcı ortamı yardımı sağlamak için adlandırma kurallarına güvenmelidir.

  • WPF XAML yükleyicisinin geçerli uygulaması sarmalayıcıları tamamen atlar ve öznitelik değerlerini işlerken adlandırma kuralına dayanır. Daha fazla bilgi için bkz . XAML Yükleme ve Bağımlılık Özellikleri.

Yeni Bağımlılık Özelliği için Özellik Meta Verileri

Bağımlılık özelliğini kaydettiğinizde, özellik sistemi aracılığıyla kayıt özelliği özelliklerini depolayan bir meta veri nesnesi oluşturur. Bu özelliklerin birçoğu, özelliği basit imzalarıyla kaydedildiyse ayarlanmış varsayılan değerlere Registersahiptir. diğer imzaları Register , özelliği kaydederken istediğiniz meta verileri belirtmenize olanak tanır. Bağımlılık özellikleri için verilen en yaygın meta veriler, özelliği kullanan yeni örneklere uygulanan varsayılan bir değer vermektir.

türetilmiş bir sınıfında FrameworkElementvar olan bir bağımlılık özelliği oluşturuyorsanız, temel PropertyMetadata sınıf yerine daha özelleştirilmiş meta veri sınıfını FrameworkPropertyMetadata kullanabilirsiniz. Sınıfın oluşturucusunun FrameworkPropertyMetadata çeşitli meta veri özelliklerini birlikte belirtebileceğiniz çeşitli imzaları vardır. Yalnızca varsayılan değeri belirtmek istiyorsanız, türünde Objecttek bir parametre alan imzayı kullanın. Bu nesne parametresini özelliğiniz için türe özgü bir varsayılan değer olarak geçirin (sağlanan varsayılan değer, çağrıda Register parametre olarak propertyType sağladığınız tür olmalıdır).

için FrameworkPropertyMetadata, özelliğiniz için meta veri seçeneği bayrakları da belirtebilirsiniz. Bu bayraklar, kayıt sonrasında özellik meta verilerinde ayrık özelliklere dönüştürülür ve belirli koşulluları düzen altyapısı gibi diğer işlemlere iletmek için kullanılır.

Uygun Meta Veri Bayraklarını Ayarlama

  • Özelliğiniz (veya değerindeki değişiklikler) kullanıcı arabirimini (UI) etkiliyorsa ve özellikle düzen sisteminin öğenizi bir sayfada nasıl boyutlandırıp işlemesi gerektiğini etkiliyorsa, aşağıdaki bayraklardan birini veya daha fazlasını ayarlayın: AffectsMeasure, AffectsArrange, AffectsRender.

    • AffectsMeasure , bu özellikte yapılan bir değişikliğin, içeren nesnenin üst öğe içinde daha fazla veya daha az alan gerektirebileceği ui işlemede değişiklik gerektirdiğini gösterir. Örneğin, bir "Width" özelliğinde bu bayrak ayarlanmalıdır.

    • AffectsArrange , bu özellikte yapılan bir değişikliğin, genellikle ayrılmış alanda değişiklik gerektirmeyen, ancak alan içindeki konumlandırmanın değiştiğini gösteren ui işlemesinde değişiklik gerektirdiğini gösterir. Örneğin, bir "Hizalama" özelliğinde bu bayrak ayarlanmalıdır.

    • AffectsRender düzen ve ölçüyü etkilemeyecek, ancak başka bir işleme gerektiren başka bir değişikliğin oluştuğuna işaret eder. Örneğin, "Arka Plan" gibi mevcut bir öğenin rengini değiştiren bir özellik olabilir.

    • Bu bayraklar genellikle özellik sisteminin veya düzen geri çağırmalarının kendi geçersiz kılma uygulamalarınız için meta verilerde protokol olarak kullanılır. Örneğin, örneğin herhangi bir özelliği bir OnPropertyChanged değer değişikliği bildiriyorsa ve meta verilerinde olduğu gibi true varsa AffectsArrange çağıracak InvalidateArrange bir geri çağırmanız olabilir.

  • Bazı özellikler, yukarıda belirtilen gerekli boyuttaki değişikliklerin üzerinde ve ötesinde, içeren üst öğenin işleme özelliklerini etkileyebilir. Buna örnek olarak MinOrphanLines , akış belgesi modelinde kullanılan ve bu özellikte yapılan değişikliklerin paragrafı içeren akış belgesinin genel işlemesini değiştirebildiği özellik örnektir. Kendi özelliklerinizde benzer durumları tanımlamak için veya AffectsParentMeasure kullanınAffectsParentArrange.

  • Varsayılan olarak, bağımlılık özellikleri veri bağlamayı destekler. Veri bağlama için gerçekçi bir senaryo olmadığı veya büyük bir nesne için veri bağlama performansının sorun olarak algılandığı durumlarda veri bağlamayı kasıtlı olarak devre dışı bırakabilirsiniz.

  • Varsayılan olarak, bağımlılık özellikleri için veri bağlama Mode varsayılan olarak olur OneWay. Bağlamayı her zaman bağlama örneğine TwoWay göre değiştirebilirsiniz; ayrıntılar için bkz . Bağlama Yönünü Belirtme. Ancak bağımlılık özelliği yazarı olarak özelliğin varsayılan olarak bağlama modunu kullanmasını TwoWay seçebilirsiniz. Var olan bir bağımlılık özelliğine MenuItem.IsSubmenuOpenörnek olarak ; bu özelliğin senaryosu, ayar mantığının IsSubmenuOpen ve varsayılan tema stiliyle etkileşim kurma işleminin MenuItem olmasıdır. Özellik mantığı, IsSubmenuOpen özelliğin durumunu diğer durum özelliklerine ve yöntem çağrılarına göre korumak için yerel olarak veri bağlamayı kullanır. Varsayılan olarak bağlanan TwoWay başka bir örnek özellik de şeklindedir TextBox.Text.

  • Ayrıca bayrağını ayarlayarak Inherits özel bağımlılık özelliğinde özellik devralmayı etkinleştirebilirsiniz. Özellik devralma, üst öğelerin ve alt öğelerin ortak bir özelliğe sahip olduğu bir senaryo için kullanışlıdır ve alt öğelerin söz konusu özellik değerinin üst öğe tarafından ayarlanan değerle aynı değere ayarlanması mantıklıdır. Devralınabilir bir özellik örneği, DataContextveri sunumu için önemli ana ayrıntı senaryoyu etkinleştirmek üzere bağlama işlemleri için kullanılan özelliğidir. Devralınabilir hale getirerek DataContext , tüm alt öğeler de bu veri bağlamı devralır. Özellik değeri devralma nedeniyle, sayfa veya uygulama kökünde bir veri bağlamı belirtebilirsiniz ve bunu tüm olası alt öğelerdeki bağlamalar için yeniden belirtmeniz gerekmez. DataContext devralma işleminin varsayılan değeri geçersiz kıldığını ancak her zaman belirli bir alt öğede yerel olarak ayarlanabildiğini göstermek için iyi bir örnektir; Ayrıntılar için bkz . Hiyerarşik Verilerle Ana Ayrıntı Desenini Kullanma. Özellik değeri devralma olası bir performans maliyetine sahiptir ve bu nedenle tedbirli kullanılmalıdır; Ayrıntılar için bkz . Özellik Değeri Devralma.

  • Journal Bağımlılık özelliğinizin algılanması mı yoksa gezinti günlüğü hizmetleri tarafından mı kullanılması gerektiğini belirtmek için bayrağını ayarlayın. Özellik buna örnek olarak verilmiştir SelectedIndex ; günlük kaydı geçmişine gidildiğinde seçim denetiminde seçilen tüm öğeler kalıcı olmalıdır.

Salt Okunur Bağımlılık Özellikleri

Salt okunur bir bağımlılık özelliği tanımlayabilirsiniz. Ancak, özelliğinizi neden salt okunur olarak tanımlayabileceğiniz senaryoları, özellik sistemine kaydetme ve tanımlayıcıyı kullanıma açma yordamı gibi biraz farklıdır. Daha fazla bilgi için bkz . Salt Okunur Bağımlılık Özellikleri.

Koleksiyon Türü Bağımlılık Özellikleri

Koleksiyon türü bağımlılık özelliklerinin dikkate alınması gereken bazı ek uygulama sorunları vardır. Ayrıntılar için bkz . Koleksiyon Türü Bağımlılık Özellikleri.

Bağımlılık Özelliği Güvenliğiyle İlgili Dikkat Edilmesi Gerekenler

Bağımlılık özellikleri genel özellikler olarak bildirilmelidir. Bağımlılık özelliği tanımlayıcı alanları genel statik alanlar olarak bildirilmelidir. Diğer erişim düzeylerini (korumalı gibi) bildirmeye çalışsanız bile, bir bağımlılık özelliğine her zaman özellik sistemi API'leri ile birlikte tanımlayıcı üzerinden erişilebilir. Korunan tanımlayıcı alanı bile, gibi LocalValueEnumeratorözellik sisteminin parçası olan meta veri raporlama veya değer belirleme API'leri nedeniyle erişilebilir durumdadır. Daha fazla bilgi için bkz . Bağımlılık Özelliği Güvenliği.

Bağımlılık Özellikleri ve Sınıf Oluşturucuları

Yönetilen kod programlamada (genellikle FxCop gibi kod çözümleme araçları tarafından zorlanan) sınıf oluşturucularının sanal yöntemleri çağırmaması gereken genel bir ilke vardır. Bunun nedeni, oluşturucuların türetilmiş bir sınıf oluşturucusunun temel başlatması olarak çağrılabilmesi ve oluşturucu aracılığıyla sanal yöntemin girilmesi, oluşturulmakta olan nesne örneğinin tamamlanmamış başlatma durumunda gerçekleşebilir. zaten türetilen herhangi bir sınıftan türetilirken DependencyObject, özellik sisteminin kendisinin sanal yöntemleri dahili olarak çağırdığını ve kullanıma çıkardığını bilmeniz gerekir. Bu sanal yöntemler WPF özellik sistemi hizmetlerinin bir parçasıdır. Yöntemleri geçersiz kılma, türetilmiş sınıfların değer belirlemeye katılmasını sağlar. Çalışma zamanı başlatmayla ilgili olası sorunları önlemek için, çok belirli bir oluşturucu desenini izlemediğiniz sürece sınıfların oluşturucuları içinde bağımlılık özellik değerlerini ayarlamamalısınız. Ayrıntılar için bkz. DependencyObjects için Kasa Oluşturucu Desenleri.

Ayrıca bkz.