如何:更新TreeView MVVM?

时间:2015-08-18 13:44:10

标签: wpf mvvm treeview

我有一个树视图,显示从“项目根目录”开始的文件和文件夹(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。在大多数情况下,我对此感到满意,最大的问题是用户必须重新扩展所有子文件夹。

我觉得我可能会遗漏一些明显的东西,因为这似乎是一个常见的要求。

我对想法和改变我的结构持开放态度。

1 个答案:

答案 0 :(得分:0)

每次调用get时,

Your Children属性都会返回一个新集合。这通常是不好的做法,可能不适合您的方案。创建一个字段并返回该字段。