簡體   English   中英

WPF TreeView不顯示子級

[英]WPF TreeView not showing childs

我正在實現一個自定義設計的FolderSelector,並且正在使用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>

這是整個對話框的視圖模型

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根對象也不應用於子級
  • 子項不會顯示(選擇根項目后將正確加載它們)
  • 我想顯示無限數量的孩子

明確聲明類型參數,即使用{x:Type} ,並將LabelContent屬性綁定到FolderViewModelName屬性:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM