WPF TreeView未显示孩子



我正在实现一个自定义设计的文件仪,我正在使用treeview显示文件夹。

这是视图:

<TreeView Grid.Row="1" Background="Transparent" ItemsSource="{Binding Path=Items}">
    <TreeView.ItemContainerStyle>
        <Style TargetType="{x:Type TreeViewItem}">
            <Setter Property="IsSelected" Value="{Binding Path=IsSelected}" />
        </Style>
    </TreeView.ItemContainerStyle>
    <TreeView.Resources>
        <HierarchicalDataTemplate DataType="viewModel:FolderViewModel" ItemsSource="{Binding Path=Items}">
            <DockPanel>
                <fa:FontAwesome Icon="FolderOutline" Foreground="#dd5d18" VerticalAlignment="Center" />
                <Label Content="{Binding}" VerticalAlignment="Center" FontWeight="SemiBold" />
            </DockPanel>
        </HierarchicalDataTemplate>
    </TreeView.Resources>
</TreeView>

这是整个对话框的ViewModel

internal class FolderBrowserViewModel : BaseBAObject
{
    #region Fields        
    #endregion
    #region Properties
    public ObservableCollection<FolderViewModel> Items { get; }
    #endregion
    #region Construction
    public FolderBrowserViewModel()
    {
        Items = new ObservableCollection<FolderViewModel>();
        LoadItems();
    }
    #endregion
    #region Methods
    private void LoadItems()
    {
        try
        {
            var drives = DriveInfo.GetDrives();
            foreach (var drive in drives)
            {
                Items.Add(new FolderViewModel(drive.Name.Replace(@":", ""), drive.Name));
            }
        }
        catch (Exception)
        {
            // Ignore
        }
    }
    #endregion
}

这是每个文件夹的ViewModel

internal class FolderViewModel : BaseBAObject
{
    #region Fields
    private bool _isSelected;
    private bool _isLoaded;
    #endregion
    #region Properties
    public string Path { get; }
    public string Name { get; }
    public ObservableCollection<FolderViewModel> Items { get; }
    public bool IsSelected
    {
        get { return _isSelected; }
        set
        {
            if (value != _isSelected)
            {
                _isSelected = value;
                OnPropertyChanged(nameof(IsSelected));
                LoadSubfolders();
            }
        }
    }
    #endregion
    #region Construction
    public FolderViewModel(string name, string path)
    {
        Path = path;
        Name = name;
        Items = new ObservableCollection<FolderViewModel>();
    }
    #endregion
    #region Methods
    public void LoadSubfolders(bool force = false)
    {
        if(_isLoaded && !force)
            return;
        try
        {
            var dirs = Directory.GetDirectories(Path);
            Items.Clear();
            foreach (var dir in dirs)
            {
                Items.Add(new FolderViewModel(dir, System.IO.Path.Combine(Path, dir)));
            }
            _isLoaded = true;
        }
        catch (Exception)
        {
            // ignore
        }
    }
    public override string ToString()
    {
        return Name;
    }
    #endregion
}

我现在面临几个问题

  • 数据模板不应用于TreeView root对象或Childs
  • 未显示孩子(选择根项目时,它们已正确加载)
  • 我想展示一个无限的孩子

有关类型参数,即使用{x:Type},并将Label的CC_3属性绑定到FolderViewModelName属性:

>
<HierarchicalDataTemplate DataType="{x:Type viewModel:FolderViewModel}" ItemsSource="{Binding Path=Items}">
    <DockPanel>
        <Label Content="{Binding Name}" VerticalAlignment="Center" FontWeight="SemiBold" />
    </DockPanel>
</HierarchicalDataTemplate>

相关内容

最新更新