Какая польза от 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_: Извините, я бы прочитал вопрос точнее. Я изменил свой ответ. Кстати +1 за вопрос. - person HCL; 25.02.2011
comment
Привет ХКЛ. Большое спасибо, что нашли время, чтобы прочитать мой комментарий и ответить еще раз. Я очень ценю это. Я не мог придумать никакой полезной цели для регистрации dp1 таким образом, но поскольку он не выдавал исключения, я подумал, что у него должна быть цель, о которой я не знал. Спасибо за подтверждение, что это не делает ничего полезного. - person Matt__E_; 25.02.2011