Nano Hash - криптовалюты, майнинг, программирование

WPF Custom Control - шаблон ItemsControl не применяется

Я создаю настраиваемый элемент управления WPF, производный от TabControl. В ControlTemplate я использую ItemsControl для отображения списка, который привязывается из шаблона (наблюдаемая коллекция типа FileMenuItem). Во время выполнения программы в окне вывода появляется следующая ошибка:

ItemTemplate и ItemTemplateSelector игнорируются для элементов, уже принадлежащих типу контейнера ItemsControl; Тип = 'FileMenuItem'

Тип FileMenuItem является производным от MenuItem. Если я изменю базовый класс на DependencyObject, код действительно запустится, и шаблон будет применен (так что это вариант). Я погуглил об ошибке и ничего не нашел, сталкивался ли кто-нибудь с этим при разработке пользовательских элементов управления? Несмотря на то, что у меня есть обходной путь, я хотел бы понять, что происходит, и я думаю, что использование MenuItem в качестве базового класса - более чистая реализация.

Я могу опубликовать больше кода, если это поможет. Спасибо!

01.05.2010

Ответы:


1

Цель DataTemplate (например, ItemTemplate) - предоставить визуализацию для объекта данных. В частности, он определяет набор элементов для добавления к визуальному дереву вместо данных, передаваемых ContentPresenter или ItemsPresenter. В вашем случае исходный список представляет собой набор объектов, которые уже можно добавить непосредственно в визуальное дерево для отображения в пользовательском интерфейсе.

Вы можете увидеть это в следующем упрощенном примере, где только «Три» отображается красным цветом, потому что первые два элемента определены в форме, которая может отображаться непосредственно с помощью ComboBox.

<ComboBox>
    <ComboBox.ItemTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding}" Foreground="Red"/>
        </DataTemplate>
    </ComboBox.ItemTemplate>
    <ComboBoxItem>One</ComboBoxItem>
    <ComboBoxItem>Two</ComboBoxItem>
    <sys:String>Three</sys:String>
</ComboBox>
03.05.2010
  • Хорошо, я думаю, что понимаю - так можно ли поддерживать этот сценарий или мне нужно переключиться на наследование от другого базового класса? Спасибо за вашу помощь! 04.05.2010
  • Вы можете пойти разными путями. Вы должны попытаться решить, хотите ли вы обрабатывать элементы коллекции как элементы управления (производные от UIElement) или данные (INotifyPropertyChanged или DependencyObject) или создать как класс данных, так и элемент управления пользовательского интерфейса или DataTemplate. Другой возможный вариант - это производный ItemsControl, который переопределяет GetContainerForItemOverride и IsItemItsOwnContainerOverride, чтобы использовать контейнер FileMenuItem для каждого элемента (ComboBox, ListBox и т. Д. Делают это). 04.05.2010
  • Один из самых простых (и эффективных) подходов к решению этой проблемы для меня всегда заключался в том, чтобы получить свой собственный ItemsControl и переопределить метод IsItemItsOwnContainerOverride для возврата false, что означает, что DataTemplate не будет пропущен из-за проблемы, которую объяснил Джон. 08.10.2014
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..