2010-07-19 23 views
11

Ekli bir bağımlılık özelliğine kısıtlama eklemenin bir yolu var, böylece yalnızca belirli bir türe uygulanabiliyor, meta verilerde bir şey var mı?Bağlı bağımlılık özelliğinin kapsamını sınırlamak için kısıtlama

Değilse, ekli DP'lerin statik Get-and Set-yöntemlerini açık bir şekilde yazmak anlamlı mıdır?

Örnek:

Ben mesela şu bildiriyi varsa:

public static int GetAttachedInt(DependencyObject obj) { 
    return (int)obj.GetValue(AttachedIntProperty); 
} 

public static void SetAttachedInt(DependencyObject obj, int value) { 
    obj.SetValue(AttachedIntProperty, value); 
} 

public static readonly DependencyProperty AttachedIntProperty = 
    DependencyProperty.RegisterAttached("AttachedInt", typeof(int), 
    typeof(Ownerclass), new UIPropertyMetadata(0)); 

sadece metin kutularının uygulamak için, aşağıdaki gibi değiştirmek anlamlı olurdu? GetValue ve SetValue herhangi bir türü için artık kullanılmamaktadır ve işaretlemeye de attachement sınırlamak için hiçbir olasılık olabilir çünkü bu, bir tutmayabiliyor yol açtığı için

public static int GetAttachedInt(TextBox textBox) { 
    return (int)textBox.GetValue(AttachedIntProperty); 
} 

public static void SetAttachedInt(TextBox textBox, int value) { 
    textBox.SetValue(AttachedIntProperty, value); 
} 

public static readonly DependencyProperty AttachedIntProperty = 
    DependencyProperty.RegisterAttached("AttachedInt", typeof(int), 
    typeof(Ownerclass), new UIPropertyMetadata(0)); 

sorum vardır.

Daha önce yaptığım şey, PropertyChanged işleyicisine bir istisna ekledim ve yalnızca xy türlerine izin verilen bir istisna getirdim.

Ne düşünüyorsunuz?

+0

İyi soru ... Umarım yeni cevabım çözer. – Noldorin

+2

Meta veriler için başka bir cevap istemiştim ama hiçbir şey görmedim. Erişim yöntemlerinin beyan edilmesi için onun bir politik sorun olduğunu düşünüyorum. Bunu yapmak için sağduyuluysa, yapacağım. Ama benim için biraz büyük bir kilit ile balkon kapatmak gibi ama ana kapı kilidi açık bırakın. Ancak en azından set-and yöntemleri, ekli dp'nin amacını gösterir. Tavsiyenizi kullanacağım, ancak PropertyChanged-işleyicisindeki hedef türünü kontrol etmeye devam edeceğim. Bu nedenle, bir kullanıcı DP'yi yanlış bir kontrolde kullanmaya çalıştığında, tasarımcıya bir istisna uygulayacaktır. – HCL

cevap

15

Hedeflenen bağlı özelliklerin türünü kısıtlamak için yapmanız gereken tek şey, GetPropertyName ve yöntemlerinin tanımlarını değiştirmektir.

Örnek: MyTargetTypeDependencyObject devralan herhangi bir tür olabilir

public static int GetAttachedInt(MyTargetType obj) 
{ 
    return (int)obj.GetValue(AttachedIntProperty); 
} 

public static void SetAttachedInt(MyTargetType obj, int value) 
{ 
    obj.SetValue(AttachedIntProperty, value); 
} 

.

+2

Şey, çok yanlış ... Visual Studio 2013 ile denedim ve özelliği başka bir şeye eklemeyi denerseniz, aşağıdaki hatayı verir: ** Eklenen özellik "AttachedInt", yalnızca türetilen türlerine uygulanabilir. "TextBox". ** –

+0

Benoit haklı. VS2013'te XAML intellisense, onu desteklenmeyen bir öğeye eklemenizi engeller. ReSharper kullanmıyorum. –

İlgili konular