Multibinding в TreeView в WPF
Я хочу привязать 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; }
}
другие классы ares:
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>
Итак, я получаю что-то вроде этого:
rootFolder
|
|-File
|-File
|-Folder
|-File
|-File
|-Folder
|-File
3 ответов
что именно ваш вопрос? Как их объединить? CompositeCollection
.
EDIT: как упоминалось в комментариях, my Intuipic приложение делает что-то очень похожее на то, что вы спрашиваете. Вот скриншот:
Это довольно легко, учитывая ваше созвездие.
во-первых: Настройте свои классы. Вам не нужны два отдельных списка для файлов и папок в классе folders. Просто используйте один IList<Base_FileFolder>
внутри класса Base_FileFolder (хороший ООП) и назовите его детьми!
тогда вам понадобится всего два шага:
-
Два HierarchicalDataTemplates
<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, как это
<TreeView Name="TreeViewFileTree" ItemsSource="{rootFolder.Children}" />
вот именно. Сила WPF-его простота.
вам нужно использовать Вам понадобится 3 вещи:
- A HierarchicalDataTemplate, как у вас есть, чтобы сделать parent+children и шаблон папок. вы можете использовать CompositeCollection здесь, чтобы объединить папки+файлы, но я не уверен в этом...возможно, вам придется добавить другое свойство в класс folder, которое возвращает объединение файлов и папок и называет его "дети" или что-то еще...
- DataTemplate для файлов шаблонов в дереве
- A TemplateSelector, чтобы сообщить дереву переключаться между шаблонами в зависимости от элемента в дереве. Вместо установки ItemTemplate на дереве установите для ItemTemplateSelector значение this.