TreeView Multibinding в WPF
-
30-09-2019 - |
Вопрос
Я хочу связать TreeView к классу, как этот:
public class Folder : Base_FileFolder
{
public Folder()
{
Folders = new ObservableCollection<Folder>();
Files = new ObservableCollection<File>();
}
public ObservableCollection<Folder> Folders { get; set; }
public ObservableCollection<File> Files { get; set; }
}
Другие классы Арес:
public class File : Base_FileFolder
{
}
public class Base_FileFolder : DependencyObject
{
public string Name
{
get { return (string)GetValue(NameProperty); }
set { SetValue(NameProperty, value); }
}
public static readonly DependencyProperty NameProperty = DependencyProperty.Register("Name", typeof(string), typeof(Base_FileFolder), new UIPropertyMetadata(""));
}
Как я могу создать TreeView, который показывает файлы и коллекцию папок
Я хочу использовать что-то вроде этого:
<HierarchicalDataTemplate
DataType="{x:Type model:Folder}"
ItemsSource="{Binding Childs}">
<DockPanel>
<Label Content="{Binding Name}"/> </DockPanel>
</HierarchicalDataTemplate>
Так что я получаю что-то так:
Корневая папка
|
|-File
|-File
|-Folder
|-File
|-File
|-Folder
|-File
Решение
Что именно ваш вопрос? Как их объединить? CompositeCollection
.
Редактировать: Как уже упоминалось в комментариях, мой Intuipic. Приложение делает что-то очень похоже на то, что вы запрашиваете. Вот скриншот:
Другие советы
Это довольно легко, учитывая ваше созвездие.
Сначала: настройте свои классы. Вам не нужно два отдельных списка для файлов и папок в классе папок. Просто используйте один IList<Base_FileFolder>
Внутри класса base_filefolder (хороший Ооп) и назовете его детьми!
Тогда вам понадобится только два шага:
Две иерархическиедататематы
<HierarchicalDataTemplate DataType="{x:Type FolderNode}" ItemsSource="{Binding Path=Children}"> <Grid> <TextBlock Text="{Binding FolderName}" /> </Grid> </HierarchicalDataTemplate> <HierarchicalDataTemplate DataType="{x:Type FileNode}" ItemsSource="{Binding Path=Children}"> <Grid> <TextBlock Text="{Binding FileName}" /> </Grid> </HierarchicalDataTemplate>
И дерево, как это
<TreeView Name="TreeViewFileTree" ItemsSource="{rootFolder.Children}" />
Вот и все. Сила WPF - это его простота.
Вам нужно использовать, вам понадобится 3 вещи:
- Иерархикатататемеяная плата, как у вас, чтобы сделать родитель + дети и шаблон папки. Возможно, вы сможете использовать композиционную технику здесь, чтобы объединить папки + файлы, но я не уверен в том, что ... Возможно, вам придется добавить еще одно свойство в классе папок, который возвращает Union файлов и папок и вызовов его » Дети "или что-то еще ...
- DataTemplate для шаблонов файлов в дереве
- Темпленок, чтобы сказать дереву, чтобы переключаться между шаблонами в зависимости от элемента в дереве. Вместо того, чтобы установить itemTemplate на дереве, настройте ItemTemplateHelector к этому.