WPF XAML DataTrigger ContentTemplate [дубликат]

Конструктор - это метод экземпляра со специальным значением - в частности, он называется внутренне при создании экземпляра соответствующего класса с новым . Это ключевое различие.

Другие незначительные отличия заключаются в том, что конструктор должен иметь то же имя, что и класс, к которому он принадлежит, и он не может иметь никакого возвращаемого значения, даже пусто.

10
задан akjoshi 14 October 2014 в 10:07
поделиться

3 ответа

Я слышал, что 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 (пока)

. Я не знаю каких-либо существенных различий в производительности между ними, хотя мне было бы интересно, если кто-то скажет мне об этом.

9
ответ дан Rachel 15 August 2018 в 16:30
поделиться
  • 1
    Интересно, я почти уверен, что вопрос касался WPF, просто из любопытства, - они исправили неявные шаблоны в SL4 / 5, поскольку я знаю, что они не были доступны в предыдущих версиях. – user 19 January 2012 в 15:58
  • 2
    @Dmitry Я считаю, что последний проект Silverlight, который я сделал, был в 4.0, а неявные DataTemplates не работали тогда. Я слышал, что они работают в 5.0, но пока этого не произошло. – Rachel 19 January 2012 в 16:03
  • 3
    +1 для 'DataTemplateSelectors не обновляют шаблон, если значение, на котором они основаны на chan'. Я проверил это, и шаблон не обновляется, если значение изменяется. Благодарю. – akjoshi 20 January 2012 в 08:05
  • 4
    Это не всегда так. Если у вас есть ContentPresenter с Content = {Binding Path = SomeProp}, то, если SomeProp изменится, ContentPresenter снова спросит TemplateSelector для шаблона. Однако, если SomeProp НЕ изменяет, но свойство этого объекта изменяется, вы больше не получите вызов селектора шаблонов. – MikeKulls 6 July 2012 в 04:38
  • 5
    Вот пример datatemplateselector из @Rachel change-datatemplate-dynamicam – huoxudong125 15 October 2014 в 02:15

Я бы предположил, что ответ является более важным из того, что вы считаете необходимым control. Вы получаете целую кучу функциональности с помощью функции control, которая недоступна для DataTemplate. Вы можете добавить DependencyProperties, events, functions и т. Д. Но вам это нужно? Если вы этого не сделаете, элемент управления может быть переполнен.

0
ответ дан akjoshi 15 August 2018 в 16:30
поделиться

У вас есть два вопроса:)

  1. Где сделать деление в XAML (DataTriggers) или в коде TemplateSelector
  2. Что такое вы переопределяете все Style или просто DataTemplate. В первом примере вы переопределяете Style, во втором - DataTemplate.

Вот мой 2c:

Я бы придерживался триггеров , так как вы получите непревзойденный уровень гибкости с ними - новый редактор по цене нового ресурса и триггер всего в XAML - что может быть лучше? Существует один потенциальный оговорка, связанная с использованием DataTrigger - это может привести к утечкам данных.

Говоря о выборе Style vs DataTemplate, я снова использую Style. Это может быть немного более тяжелое визуальное дерево, но это даст вам окончательный контроль над вашими редакторами.

В частности, некоторые свойства могут быть определены только на уровне Style, используя Style Setters. Определение уровня @ DataTemplate просто не будет работать, так как ваш контент DataTemplate не является непосредственным дочерним элементом вашего контейнера управления (есть дополнительный уровень - элемент управления actula). Если у вас нет таких свойств, ControlTemplates тоже хороши и, вероятно, быстрее (?).

3
ответ дан user 15 August 2018 в 16:30
поделиться
  • 1
    Спасибо, Дмитрий, можете ли вы предоставить более подробную информацию о «DataTrigger, вызывающем утечку данных»? – akjoshi 20 January 2012 в 09:36
  • 2
    @akjoshi - Извините, я не смогу придумать точный репрограммирование, это скорее наблюдение, я видел несколько проектов, которые приносят пользу после сокращения количества триггеров. – user 20 January 2012 в 11:21
Другие вопросы по тегам:

Похожие вопросы: