我有一个树视图,显示从“项目根目录”开始的文件和文件夹(C:\ Banana)
如果在根目录中添加了文件或文件夹,我希望它显示在我的树视图中
<TreeView ItemsSource="{Binding ExplorerRoot}">
<TreeView.Resources>
<HierarchicalDataTemplate DataType="{x:Type Model:FolderItem}" ItemsSource="{Binding Children}">
<TextBlock Text="{Binding Caption}"></TextBlock>
</HierarchicalDataTemplate>
<DataTemplate DataType="{x:Type IO:FileInfo}">
<TextBlock Text="{Binding Name}" Tag="{Binding FullName}" />
</DataTemplate>
</TreeView.Resources>
</TreeView>
public class FolderItem
{
public DirectoryInfo Info { get; set; }
public FolderItem(DirectoryInfo info)
{
Info = info;
}
public FolderItem(string path) : this(new DirectoryInfo(path)) {}
public string Caption
{
get { return Info.Name; }
}
public IList Children
{
get
{
var children = new CompositeCollection();
var subdir = Info.GetDirectories().Select(info => new FolderItem(info)).ToList();
children.Add(new CollectionContainer { Collection = subdir });
children.Add(new CollectionContainer { Collection = Info.GetFiles() });
return children;
}
}
}
在OpeProjectCommand上的ViewModel
ExplorerRoot = new ObservableCollection<FolderItem> { new FolderItem(_project) };
OnPropertyChanged("ExplorerRoot");
到目前为止,我尝试了几种不同的路由,包括向FolderItem添加一个计时器,在Elapsed上会调用OnPropertyChanged(“Children”),但是这会导致节点在重建时不断崩溃。我还尝试连接添加到FolderItem的IsExpanded bool和事件之间的绑定,但似乎无法使绑定正确。我也开始添加一个FileSystemWatcher的路径,但因为我没有更好的方法来更新ExplorerRoot而停止了。
目前我只是实现了一个“刷新”按钮,它只是重新绑定了ExplorerRoot。在大多数情况下,我对此感到满意,最大的问题是用户必须重新扩展所有子文件夹。
我觉得我可能会遗漏一些明显的东西,因为这似乎是一个常见的要求。
我对想法和改变我的结构持开放态度。
答案 0 :(得分:0)
Your Children属性都会返回一个新集合。这通常是不好的做法,可能不适合您的方案。创建一个字段并返回该字段。