C# WPF MVVM TreeViewItem切换按钮始终不显示问题
嘿,我之前也碰到过一模一样的问题!你的ToggleButton死活不出现,核心原因其实很直白——你用的List<FileData>是个普通集合,没法通知WPF它的内容变了。
WPF的TreeView判断要不要显示ToggleButton,全看绑定集合的HasItems状态。但List<T>没实现INotifyCollectionChanged接口,等你后续动态往ServerAlbums[X].AlbumFiles里塞文件时,UI根本不知道集合已经有内容了,自然不会更新HasItems,ToggleButton就一直藏着不肯出来。
最优雅的解决方案:把List<FileData>换成ObservableCollection<FileData>
只需要修改你的AlbumData模型,把集合类型换成ObservableCollection<T>——它天生自带集合变化通知功能,WPF会自动监听并更新UI状态:
public class AlbumData : ViewModelBase { // 构造方法参数同步换成ObservableCollection<FileData> public AlbumData(string albumName, ObservableCollection<FileData> albumFileList) { if (string.IsNullOrEmpty(albumName) || albumFileList == null) { return; } AlbumName = albumName; AlbumFiles = albumFileList; } public string AlbumName { get; set; } = ""; // 将List替换为ObservableCollection private ObservableCollection<FileData> _AlbumFiles = new ObservableCollection<FileData>(); public ObservableCollection<FileData> AlbumFiles { get { return _AlbumFiles; } set { _AlbumFiles = value; OnPropertyChanged(new PropertyChangedEventArgs("AlbumFiles")); } } }
初始化时的小细节
如果从SFTP获取的文件列表一开始是List<FileData>类型,创建AlbumData的时候转成ObservableCollection就行:
// 假设GetSftpFiles()返回List<FileData> var sftpFileList = GetSftpFiles(); var newAlbum = new AlbumData("旅行相册", new ObservableCollection<FileData>(sftpFileList)); ServerAlbums.Add(newAlbum);
动态添加文件的正确姿势
之后你要给某个相册动态加文件,直接操作ObservableCollection就好,UI会自动响应并显示ToggleButton:
// 给第一个相册新增文件 ServerAlbums[0].AlbumFiles.Add(new FileData { Display = "海边日落.jpg" });
这么一改,完全不用手动设置HasItems,完美遵循WPF的数据绑定机制,绝对是最优雅的解决方式~
内容的提问来源于stack exchange,提问作者David Bentley
相关产品推荐
相关产品推荐

