none
ControlTemplate vs DataTemplate и причём тут ContentPresenter RRS feed

  • Вопрос

  • Добрый день.

    Подскажите пожалуйста

    ContentPresenter описывает отображение элемента.

    В ControlTemplate он присутствует.

    Почему его нет в DataTemplate? Я описываю DataTemplate где нибудь в ListView никакого ContentPresenter не пишу и всё отображается.

    Если в ControlTemplate уберу ContentPresenter ничего не видно.

    Почему?

    И ещё я думал, что DataTemplate описывает например вид списочных элементов ListView ListBox и т.п.

    ControlTemplate описывает вид например кнопки в стилях И ControlTemplate вроде как выше стоит чем DataTemplate. А DataTemplate как вложенный во внутренне отображение того же ControlTemplate.

    Но оказалось, что можно где то в UserControl вместо

    <Grid>
    <ListView Style={StaticResources ListViewBasewStyle}/> // имеено тут и есть ControlTemplate, а в нём DataTemplate
    <Button/>
    <Button/>
    </Grid>

    смело сделать сначала DataTempalte в нём куча контролов со своими стилями, а уже в стилях находятся ControlTemplate, а уже в ControlTemplate снова DataTemplate

    И всё это отобразить в ContentPresenter

    <ContentPresenter>
    <ContentPresenter.Content>
    <ListView /Style={StaticRecources ListViewBaseStyle}/>
    <Button/>
    <Button/>

    Т.е. DataTemplate это не только изменение вида одного контрола. Его можно смело сделать типа Windows или UserControl  - ом. С полным отображением всех контролов внутри и просто подгружать при загрузке окна или UserControl а.

    И это будет правильно с точки зрения WPF?

    Т.е. можно контролы напихать в окно, можно контролы напихать в UserControl, можно контролы напихать во Frame, можно контролы напихать в DataTemplate и селектором его загружать в то же окно?

    И это будут равнозначные варианты?


    • Изменено DevingAs 16 марта 2016 г. 6:42
    16 марта 2016 г. 6:29

Ответы

  • Добрый день.ControlTemplate это изменение шаблона контрола. DataTemplate - это определение способа как показывать объект из DataContext-а в видуальном интерфейсе. Да, одно может быть вложено в другое, но с этим лучше не увлекаться. Создать словари ресурсов, в них хранить дата и контрол темплейты и использовать их по мере надобности.
    • Помечено в качестве ответа DevingAs 16 марта 2016 г. 10:08
    16 марта 2016 г. 6:58
    Отвечающий
  • С вашими темпами изучения WPF, не удивительно, что вы запутались.

    DataTemplate это шаблон данных! (ключевое слово Data), а ControlTemplate это шаблон элемента управления! (ключевое слово Control).

    В чем разница?

    Данные - это содержимое приложения, с которым работает пользователь. Содержимое может быть простой строкой, а может быть сложным набор полей. Что бы отобразить сложный вариант понятным пользователю способом и применяется DataTemplate. Это не шаблон элемента управления, а шаблон данных, того как их увидит пользователь. Везде, где можно отобразить данные, можно и использовать DataTemplate. Наиболее частая область применения DataTemplate это коллекции данных, так как один заранее известный элемент данных можно просто прописать в XAML, а предугадать сколько будет в коллекции нельзя. Поэтому и шаблон данных.

    Элемент управления - это все те кнопочки, текстовые поля и списки, что мы используем при построении интерфейса. Для того, что бы интерфейс соответствовал нашему дизайну, в случаях когда базовых свойств недостаточно, мы меняем шаблон элемента управления ControlTemplate. Так как каждый элемент управления может иметь содержимое, как например текст внутри кнопки, мы должны указать в шаблоне место, куда это содержимое помещать. Для этого и служит ContentPresenter.

    Скорее всего до конца не разобравшись в этом, вы создаете UserControl'ы вместо изменения шаблона, хотя создавать свой UserControl имеет смысл только, когда требуется функционал не доступный в имеющихся.

    Пример:

    На картинке показан CheckBox с измененным шаблоном. ContentPresenter в данном случае расположен в правой колонке, где уже в XAML я пишу "биржа".

    Если есть уточняющие вопросы, задавайте.


    VB.Net - WPF, UWP

    • Изменено LXGDARKEditor 16 марта 2016 г. 7:21
    • Помечено в качестве ответа DevingAs 16 марта 2016 г. 10:08
    16 марта 2016 г. 7:15
    Отвечающий

Все ответы

  • Добрый день.ControlTemplate это изменение шаблона контрола. DataTemplate - это определение способа как показывать объект из DataContext-а в видуальном интерфейсе. Да, одно может быть вложено в другое, но с этим лучше не увлекаться. Создать словари ресурсов, в них хранить дата и контрол темплейты и использовать их по мере надобности.
    • Помечено в качестве ответа DevingAs 16 марта 2016 г. 10:08
    16 марта 2016 г. 6:58
    Отвечающий
  • С вашими темпами изучения WPF, не удивительно, что вы запутались.

    DataTemplate это шаблон данных! (ключевое слово Data), а ControlTemplate это шаблон элемента управления! (ключевое слово Control).

    В чем разница?

    Данные - это содержимое приложения, с которым работает пользователь. Содержимое может быть простой строкой, а может быть сложным набор полей. Что бы отобразить сложный вариант понятным пользователю способом и применяется DataTemplate. Это не шаблон элемента управления, а шаблон данных, того как их увидит пользователь. Везде, где можно отобразить данные, можно и использовать DataTemplate. Наиболее частая область применения DataTemplate это коллекции данных, так как один заранее известный элемент данных можно просто прописать в XAML, а предугадать сколько будет в коллекции нельзя. Поэтому и шаблон данных.

    Элемент управления - это все те кнопочки, текстовые поля и списки, что мы используем при построении интерфейса. Для того, что бы интерфейс соответствовал нашему дизайну, в случаях когда базовых свойств недостаточно, мы меняем шаблон элемента управления ControlTemplate. Так как каждый элемент управления может иметь содержимое, как например текст внутри кнопки, мы должны указать в шаблоне место, куда это содержимое помещать. Для этого и служит ContentPresenter.

    Скорее всего до конца не разобравшись в этом, вы создаете UserControl'ы вместо изменения шаблона, хотя создавать свой UserControl имеет смысл только, когда требуется функционал не доступный в имеющихся.

    Пример:

    На картинке показан CheckBox с измененным шаблоном. ContentPresenter в данном случае расположен в правой колонке, где уже в XAML я пишу "биржа".

    Если есть уточняющие вопросы, задавайте.


    VB.Net - WPF, UWP

    • Изменено LXGDARKEditor 16 марта 2016 г. 7:21
    • Помечено в качестве ответа DevingAs 16 марта 2016 г. 10:08
    16 марта 2016 г. 7:15
    Отвечающий
  • Элемент управления - это все те кнопочки, текстовые поля и списки, что мы используем при построении интерфейса.

    Вот видимо это сбивает меня с мысли. В DataTemplate так же ведь TextBox и Button имеются, а они в свою очередь, могут изменяться через стили, а в стилях снова может быть DataTemplate

    :)

    Но спасибо за разъяснения. Вроде понял.

    16 марта 2016 г. 10:14