Короткая версия:
Мне нужно отобразить иерархию (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.
Еще раз спасибо!