TreeView 显示分层数据

TreeView display hierarchical data

我有以下两个模型-classes:

public class FileItem : NotifyBase
{
    public FileItem(string fullPath)
    {
        FullPath = fullPath;
    }

    public string FullPath
    {
        get { return Get<string>(); }
        set
        {
            Set(value);
            OnPropertyChanged("FileName");
            OnPropertyChanged("Directory");
        }
    }

    public string Directory
    {
        get { return Path.GetDirectoryName(FullPath); }
    }

    public string FileName
    {
        get { return Path.GetFileName(FullPath); }
    }
}

public class Directory : NotifyBase
{
    public Directory(string fullPath)
    {
        FullPath = fullPath;
        Files = new ObservableCollection<FileItem>();
        Directories = new ObservableCollection<Directory>();
    }

    public ObservableCollection<FileItem> Files
    {
        get { return Get<ObservableCollection<FileItem>>(); }
        set { Set(value); }
    }

    public ObservableCollection<Directory> Directories
    {
        get { return Get<ObservableCollection<Directory>>(); }
        set { Set(value); }
    }

    public string FullPath
    {
        get { return Get<string>(); }
        set
        {
            Set(value);
            OnPropertyChanged("DirectoryName");
        }
    }

    public string DirectoryName
    {
        get
        {
            string[] directoryNameSplit = FullPath.Split(new[] { "\" }, StringSplitOptions.RemoveEmptyEntries);
            if (directoryNameSplit.Length > 0)
            {
                return directoryNameSplit[directoryNameSplit.Length - 1];
            }
            return "UNKNOWN";
        }
    }
}

class NotifyBase 只是 INotifyPropertyChanged 的一个实现。

我从文件系统加载数据,所以我有一个对象层次结构。现在我想在视图中将 DirectoryFileItem 的层次结构显示为 TreeView

在 ViewModel 中,我有一个 ObservableCollection<Directory> 名为 Directories 的根节点。

我的观点是:

<TreeView Grid.Row="1" Grid.Column="0" Grid.ColumnSpan="2" Margin="5" x:Name="tv"
          ItemsSource="{Binding Directories, UpdateSourceTrigger=PropertyChanged}">
    <TreeView.Resources>
        <HierarchicalDataTemplate DataType="{x:Type model:Directory}" ItemsSource="{Binding Directories}">
            <Label Content="{Binding Path=DirectoryName}" VerticalAlignment="Center"/>
        </HierarchicalDataTemplate>

        <DataTemplate DataType="{x:Type model:FileItem}">
            <Label Content="{Binding FileName}" VerticalAlignment="Center" Background="Red"/>
        </DataTemplate>
    </TreeView.Resources>
</TreeView>

所有文件夹都显示完美,但我没有看到任何 FileItem,我也不知道为什么。我在这里做错了什么?

因为您的两个集合是分开的,并且您没有绑定到 Files 任何地方。

不是两个集合,而是一个包含两种类型的集合。