Поскольку это моя библиотека , которую вы приводите в качестве примера преобразователей, расширяющих DependencyObject
, я думаю, что это уместно объяснить самому.
На самом деле я начал с реализации IValueConverter
с Object
в качестве базового класса. Единственная причина, по которой я переключился на расширение DependencyObject
, состояла в том, чтобы учесть методику - впервые предложенную Джошем Смитом - под названием виртуальное ветвление . Вы можете прочитать об этой технике здесь .
Предположим, вы хотите сделать что-то вроде этого:
<UserControl.Resources>
<con:CaseConverter Casing="{Binding SomeProperty}"/>
</UserControl.Resources>
Это не будет работать, потому что ресурсы не являются частью визуального дерева, и поэтому привязка не будет выполнена. Виртуальное ветвление решает эту небольшую дилемму, позволяя вам выполнить такое связывание. Тем не менее, он по-прежнему полагается - как и любая другая привязка WPF - на цель, являющуюся DependencyObject
. Таким образом, если бы я просто внедрил IValueConverter
без расширения DependencyObject
, вы бы не смогли использовать виртуальные ветви.
Теперь, если я полностью честен, я не уверен, что я все еще сделал бы это, если бы у меня было время снова. На самом деле у меня никогда не было , чтобы использовать виртуальную ветку самостоятельно - я просто хотел включить сценарий. Я могу даже изменить это в будущей версии моей библиотеки. Поэтому мой совет - придерживаться базового класса Object
(или его простого производного), если только вы действительно не думаете, что вам понадобится виртуальное ветвление.