Конструктор - это метод экземпляра со специальным значением - в частности, он называется внутренне при создании экземпляра соответствующего класса с новым . Это ключевое различие.
Другие незначительные отличия заключаются в том, что конструктор должен иметь то же имя, что и класс, к которому он принадлежит, и он не может иметь никакого возвращаемого значения, даже пусто.
Я слышал, что DataTemplateSelectors
не обновляют шаблон, если значение, на котором они основаны на изменениях, и из-за этого я обычно их не использую.
Мой предпочтительный метод на самом деле для использования DataTemplates.
<MyControl.Resources>
<DataTemplate TargetType="{x:Type local:BooleanModel}">
<local:BooleanView />
</DataTemplate>
<DataTemplate TargetType="{x:Type local:IntegerModel}">
<local:IntegerView />
</DataTemplate>
...
</MyControl.Resources>
Во-вторых, если я хочу изменить шаблон на основе свойства, а не типа объекта, я предпочитаю использовать DataTriggers
. Это связано с тем, что если это свойство когда-либо изменено, уведомление PropertyChange будет автоматически сообщать пользовательскому интерфейсу, что он изменился, и обновить шаблон. Я не верю, что DataTemplateSelectors
делает это автоматически. Я также предпочитаю видеть логику выбора шаблона в своем XAML, не скрывать его в файле TemplateSelector, но это только личное предпочтение.
И мой последний выбор - использовать DataTemplateSelector
. Я почти никогда не использую его в приложении WPF, хотя часто делаю это в Silverlight, так как он не поддерживает мой предпочтительный метод использования неявного DataTemplates
(пока)
. Я не знаю каких-либо существенных различий в производительности между ними, хотя мне было бы интересно, если кто-то скажет мне об этом.
Я бы предположил, что ответ является более важным из того, что вы считаете необходимым control
. Вы получаете целую кучу функциональности с помощью функции control
, которая недоступна для DataTemplate
. Вы можете добавить DependencyProperties
, events
, functions
и т. Д. Но вам это нужно? Если вы этого не сделаете, элемент управления может быть переполнен.
У вас есть два вопроса:)
XAML
(DataTriggers
) или в коде TemplateSelector
Style
или просто DataTemplate
. В первом примере вы переопределяете Style
, во втором - DataTemplate
. Вот мой 2c:
Я бы придерживался триггеров , так как вы получите непревзойденный уровень гибкости с ними - новый редактор по цене нового ресурса и триггер всего в XAML - что может быть лучше? Существует один потенциальный оговорка, связанная с использованием DataTrigger - это может привести к утечкам данных.
Говоря о выборе Style
vs DataTemplate
, я снова использую Style
. Это может быть немного более тяжелое визуальное дерево, но это даст вам окончательный контроль над вашими редакторами.
В частности, некоторые свойства могут быть определены только на уровне Style
, используя Style
Setters
. Определение уровня @ DataTemplate
просто не будет работать, так как ваш контент DataTemplate
не является непосредственным дочерним элементом вашего контейнера управления (есть дополнительный уровень - элемент управления actula). Если у вас нет таких свойств, ControlTemplates
тоже хороши и, вероятно, быстрее (?).