Условный список itemtemplate или datatemplate в WPF

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

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

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

Основная причина этого – избежать неприятного хакерского решения и вместо этого найти хороший чистый метод.

Надеюсь, я предоставил достаточно информации, дайте мне знать, если вам нужно больше.

Просто указать DataTemplates в Resources с соответствующим DataType достаточно, например

            

Скриншот

(Обратите внимание, что DataTemplate.DataType также может использоваться для неявного шаблона данных XML (см. Docs), тип свойства по этой причине не является System.Type , поэтому, в отличие от Style.TargetType вы должны использовать x:Type для ссылки на CLR- type. Если вы просто вводите строку, она не будет преобразована в тип.)

Вы также можете посмотреть в CompositeCollections , чтобы получить чистые объединенные списки разных типов.


Примеры данных, которые я использовал:

 ObservableCollection data = new ObservableCollection(new Employee[] { new Employee("Hans", "Programmer") , new Employee("Elister", "Programmer") , new Employee("Steve", "GUI Designer") , new Employee("Stephen", "GUI Designer") , new Employee("Joe", "Coffee Getter") , new Employee("Julien", "Programmer") , new Employee("John", "Coffee Getter") , }); ObservableCollection data2 = new ObservableCollection(new Machine[] { new Machine("XI2", String.Empty), new Machine("MK2-xx", String.Empty), new Machine("A2-B16", String.Empty), }); CompositeCollection cc1 = new CompositeCollection(); cc1.Add(new CollectionContainer() { Collection = data }); cc1.Add(new CollectionContainer() { Collection = data2 }); Data = cc1; 

Один из вариантов заключается в создании DataTemplateSelector в вашем коде:

 public class QueueDisplayDataTemplateSelector : DataTemplateSelector { public override DataTemplate SelectTemplate(object item, System.Windows.DependencyObject container) { var listBoxItem = item as JobQueueListBoxItem; var resourceName = String.Empty; switch (listBoxItem.JobQueueListBoxItemType) { case JobQueueListBoxItemType.QueuedJob : resourceName = "DataTemplateQueuedJob"; break; case JobQueueListBoxItemType.TransferWorker : resourceName = "DataTemplateTransferWorker"; break; default: throw new InvalidOperationException(string.Format("There is no corresponding list box template for {0}", listBoxItem.JobQueueListBoxItemType)); } var element = container as FrameworkElement; return element.FindResource(resourceName) as DataTemplate; } } 

Тогда это будет объявлено в вашем XAML как ресурс

    

И тогда вы присвоите это вашему списку:

   
  • настраиваемый метод getView адаптера listview, который вызывается несколько раз и не имеет когерентного порядка
  • Android: использование WebView вне контекста активности
  • Android: Как получить пользовательский вид высоты и ширины?
  • Что такое строго типизированный вид в ASP.NET MVC
  • Как реализовать держатель вида?
  • Как динамически удалять элементы из списка ListView при нажатии кнопки?
  • Android ListView child View setEnabled () и setClickable () ничего не делают
  • Скрыть нижний колонтитул в ListView?
  • Отображение изображения Qt jpg
  • Как я могу просмотреть перечисление Java из его значения String?
  • Как изменить цвет текста элемента простого списка
  • Interesting Posts

    Как обновить «массив объектов» с помощью Firestore?

    Слишком много файлов журнала, созданных в папке Temp

    Общий метод в Java без общего аргумента

    Как сохранять cookie при использовании HTTPUrlConnection?

    Отключение автоматического отступа при вставке текста в vim

    Автоматическое расширение текстового поля с помощью jQuery

    Как сохранить пробелы в DropDownList – представления ASP.NET MVC Razor

    Как я могу вернуть лицензию Microsoft, поставляемую с компьютером Dell?

    Как настроить простой VPN для безопасного подключения к Интернету через незашифрованный Wi-Fi?

    Подключите две домашние сети через VPN

    «Ошибка загрузки» Сообщение при загрузке с USB-устройства в ноутбуке

    jQuery’s .click – передать параметры пользователю

    Не удается найти менеджера AVD или SDK в Eclipse

    как использовать представления в первой структуре сущности кода

    Подмена MAC-адресов в Windows 7 – 00 как первые две цифры?

    Давайте будем гением компьютера.