Каква е ползата от DependencyProperty, чийто ownerType не е DependencyObject?

Току-що започнах да играя с DependencyProperties в WPF и исках да проверя няколко мисли, докато се справя с тях.

Като се има предвид следното (и игнориране на конвенцията за именуване за сега):

class MyTestClass
{
    public static readonly DependencyProperty dp1 = DependencyProperty.Register("MyProp", typeof(String), typeof(MyTestClass));

    public static readonly DependencyProperty dp2 = DependencyProperty.Register("MyProp2", typeof(String), typeof(MyTestClass), new PropertyMetadata("Hello"));
}

Намирам, че dp2 хвърля TypeInitializationException със съобщението "Типът 'MyTestClass' трябва да произлиза от DependencyObject", което очаквах, но dp1 се приема доста щастливо.

Сега разбирам защо dp2 повдига изключение, тъй като се опитвам да регистрирам метаданни за свойства на тип, който не е DependencyObject и това е добре. Погледнах под завивките и мога да видя пътя на кода, който dp1 и dp2 следват, така че разбирам от гледна точка на кода защо dp1 не повдига изключението, но концептуално бих очаквал и dp1, и dp2 да предизвикат едно и също изключение.

Въпросът ми е каква е ползата от създаването на DependencyProperty като dp1, чийто ownerType не е DependencyObject, тъй като не виждам как може да се използва без методите GetValue/SetValue на DependencyObject.


person Matt__E_    schedule 25.02.2011    source източник


Отговори (1)


Редактиране
Причината за първия регистър-подпис е да се регистрира DependencyProperty, който няма стойност по подразбиране, която може да бъде възстановена от Clear-метода, и също така няма регистрирано обратно извикване за промяна на стойността.

Тъй като няма стойност по подразбиране, няма да има проверка дали стойността по подразбиране е валидна и следователно вашето изключение няма да бъде хвърлено. Въпреки това няма полза от такава регистрация. Няма да имате полза от него и фактът, че не хвърля изключение, не означава, че е добър за нещо - просто не е грешен.

person HCL    schedule 25.02.2011
comment
Здравейте, благодаря за отговора. Разбирам защо ownerType може да бъде зададен на всеки обект и проверката се извършва по време на изпълнение. Въпросът ми обаче наистина беше защо следното НЕ хвърля изключение по време на изпълнение и следователно каква е ползата от създаването на DependencyProperty по този начин: DependencyProperty.Register(MyProp, typeof(String), typeof(MyTestClass)); - person Matt__E_; 25.02.2011
comment
@Matt__E_: Съжалявам, щях да прочета въпроса по-точно. Промених отговора си. BTW +1 за въпроса. - person HCL; 25.02.2011
comment
Здравей HCL. Много благодаря, че отделихте време да прочетете коментара ми и че отговорихте отново. Много го оценявам. Не можах да измисля полезна цел за регистриране на dp1 по този начин, но тъй като не хвърляше изключение, реших, че трябва да има цел, за която не знаех. Благодаря за потвърждението, че не прави нищо полезно. - person Matt__E_; 25.02.2011