C#WPF MVVM TreeViewItem ToggleButton从未显示

问题描述 投票:0回答:1

我最近一直在使用TreeView表示SFTP服务器上的文件。加载方式时,它首先获取目录,然后将其添加到TreeView。然后,它循环遍历目录,然后填充文件。

模型如下。

public class FileData : ViewModelBase
{
    private string _Display = "";
    public string Display
    {
        get
        {
            return _Display;
        }
        set
        {
            _Display = value;
            OnPropertyChanged(new PropertyChangedEventArgs("Display"));
        }
    }
}

public class AlbumData : ViewModelBase
{
    public AlbumData(string albumName, List<FileData> albumFileList)
    {
        if (string.IsNullOrEmpty(albumName) || albumFileList == null)
        {
            return;
        }

        AlbumName = albumName;
        AlbumFiles = albumFileList;
    }

    public string AlbumName { get; set; } = "";

    private List<FileData> _AlbumFiles = new List<FileData>();
    public List<FileData> AlbumFiles
    {
        get
        {
            return _AlbumFiles;
        }
        set
        {
            _AlbumFiles = value;
            OnPropertyChanged(new PropertyChangedEventArgs("AlbumFiles"));
        }
    }
}

然后在XAML中:

            <TreeView x:Name="ftpFilesTreeView" ItemsSource="{Binding ServerAlbums}">

                <TreeView.ItemTemplate>
                    <HierarchicalDataTemplate ItemsSource="{Binding AlbumFiles}" DataType="{x:Type local:AlbumData}">
                        <TextBlock Text="{Binding AlbumName}"/>
                        <HierarchicalDataTemplate.ItemTemplate>
                            <HierarchicalDataTemplate DataType="{x:Type local:FileData}">
                                <TextBlock Text="{Binding Display}"/>
                            </HierarchicalDataTemplate>
                        </HierarchicalDataTemplate.ItemTemplate>
                    </HierarchicalDataTemplate>
                </TreeView.ItemTemplate>
            </TreeView>

然后我有了ObservableCollectionTreeView的数据。

    private ObservableCollection<AlbumData> _ServerAlbums = new ObservableCollection<AlbumData>();
    public ObservableCollection<AlbumData> ServerAlbums
    {
        get { return _ServerAlbums; }
        set
        {
            _ServerAlbums = value;
            OnPropertyChanged(new PropertyChangedEventArgs("ServerAlbums"));
        }
    }

所以,我的主要问题是在将项目添加到ToggleButton之后TreeView没有显示。

我曾尝试使用Blend创建一个自定义TreeViewItem,并修改HasItems属性。我认为问题是HasItems没有更新,因为对象已添加到我的ServerAlbums[X].AlbumFiles集合中。

[我当时以为我可以做个大手笔,只是在添加东西时手动设置HasItems,但我觉得需要一个更优雅的解决方案。

c# wpf mvvm treeviewitem
1个回答
0
投票

感谢@ASh的评论,我能够看到我使用的是List而不是正确的ObservableCollection

public class AlbumData : ViewModelBase
{
    public AlbumData(string albumName, ObservableCollection<FileData> albumFileList)
    {
        if (string.IsNullOrEmpty(albumName) || albumFileList == null)
        {
            return;
        }

        AlbumName = albumName;
        AlbumFiles = albumFileList;
    }

    public string AlbumName { get; set; } = "";

    private ObservableCollection<FileData> _AlbumFiles = new ObservableCollection<FileData>();
    public ObservableCollection<FileData> AlbumFiles
    {
        get
        {
            return _AlbumFiles;
        }
        set
        {
            _AlbumFiles = value;
            OnPropertyChanged(new PropertyChangedEventArgs("AlbumFiles"));
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.