Как я могу иметь несколько типов детей в один узел Silverlight TreeView?

Краткое содержание:

Мне нужно отобразить иерархию ( TreeView ) элементов разных типов, и я не уверен, как это сделать чисто в Silverlight. В WPF легко определять шаблоны ( HierarchicalDataTemplate ) на основе типов, но эта функция недоступна в Silverlight. Похоже, что в Silverlight вам нужно применить один и тот же шаблон ко всем дочерним элементам определенного узла, так что вы получите один-единственный монстр-шаблон, который обрабатывает все возможные типы узлов, применяемых к каждому отдельному узлу.

Длинная версия (с примером ):

Чтобы дать более конкретный (но надуманный) пример, рассмотрим древовидную структуру архивов в различных папках, где каждый архив может содержать фотографии, песни и другие архивы. Каждая папка может содержать несколько подпапок и архивов.

|-Folder
  |-Folder
    |-Folder
      |-Archive
        | Photo1
        | Photo2
        | Song1
        | Song2
        |-Archive
          | Photo1
          | Song1
  |-Archive
    | Photo1
    | Photo2
    | Photo3

Каждый тип в дереве (Папка, Архив, Фото, Песня) отображается по-разному. Очевидным решением было создание HierarchicalDataTemplate для каждого типа отображаемого элемента. К сожалению, я не могу найти хороший способ сделать это, потому что кажется, что вам нужно указать один тип шаблона для всех дочерних узлов узла ( ItemsSource = {Binding ...}, ItemsTemplate = { StaticResource TemplateForAllChildren} ).

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

Есть ли какой-либо способ сделать это чисто, без накопления одного гигантского шаблона (и связанной модели представления узла) по мере добавления различных типов в дерево?

] Спасибо!

Некоторые пояснения:

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

Рассмотрим TreeView, показывающий:

Для песен: текстовое поле с прокруткой с именем исполнителя / заголовка и кнопку воспроизведения

Для изображений: эскиз и элемент управления рейтингом в звездах

] Для архивов: изображение архива с индикатором выполнения, показывающим сжатие

Для папок: простая метка, показывающая имя папки

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

В WPF я мог связывать шаблоны с типом узла, чтобы каждый узел мог использовать соответствующий шаблон. Мне интересно, есть ли способ сделать это в Silverlight.

Еще раз спасибо!

5
задан James Barber 30 November 2010 в 23:14
поделиться