可选择的TreeView文件浏览器MVVM,无法显示树

时间:2014-08-29 22:52:50

标签: c# wpf xaml mvvm treeview

撞墙,我是MVVM结构的新手,需要帮助显示我的树。我需要显示像树一样的文件浏览器。移动到mvvm后,我的树停止显示。我已经使用其中的方法创建了一个模型来构建文件树。这是我的模型。

public class UpdateContents 
{
    public string visibleName { get; set; }
    public string fullPath { get; set; }
    public bool isParent { get; private set; }
    public bool? _isSelected { get; set; }
    public UpdateContents _parent;
    public List<UpdateContents> children { get; private set; }
    public bool? isInitiallySelected { get; set; }

    public UpdateContents(string path, bool parent)
    {
        fullPath = path;
        visibleName = path.Substring(path.LastIndexOf('\\') + 1);
        isParent = parent;
        this.children = new List<UpdateContents>();
    }
    public void Initialize()
    {
        foreach (UpdateContents child in this.children)
        {
            child._parent = this;
            child.Initialize();
        }
    }
    public UpdateContents CreateDirectory(string directory)
    {
        UpdateContents groot = new UpdateContents(directory, true);
        groot.isInitiallySelected = true;
        CreateFiles(directory, groot);

        foreach (string dir in Directory.EnumerateDirectories(directory))
        {
            UpdateContents babygroot = new UpdateContents(dir, true);

            CreateFiles(dir, babygroot);
            CreateFolders(dir, babygroot);
            groot.children.Add(babygroot);
        }
        groot.Initialize();
        return groot;
    }

    private void CreateFiles(string path, UpdateContents parent)
    {
        foreach (string file in Directory.EnumerateFiles(path))
        {
            UpdateContents files = new UpdateContents(file, false);

            parent.children.Add(files);
        }
        parent.Initialize();
    }
    private void CreateFolders(string path, UpdateContents Parent)
    {
        foreach (string folder in Directory.EnumerateDirectories(path))
        {
            UpdateContents folders = new UpdateContents(folder, true);
            CreateFiles(folder, folders);
            CreateFolders(folder, folders);
            Parent.children.Add(folders);
        }
        Parent.Initialize();
    }

}

我有一个视图模型,但老实说它没有做任何事情。我改编成mvvm后编辑了它。以下是视图模型。

    public class MainWindowVM 
{
    public string rootfile { get; set; }
    public string version { get; set; }
    public string date { get; set; }
    public string _name { get; set; }
    public string _path { get; set; }

    public RelayCommand onBrowse { get; set; }

    public MainWindowVM()
    {
        onBrowse = new RelayCommand(onBrowseCommand);
    }

    public void onBrowseCommand ( object commandInvoker )
    {

        Microsoft.Win32.OpenFileDialog win = new Microsoft.Win32.OpenFileDialog();

        Nullable<bool> result = win.ShowDialog();

        if (result == true)
        {
            string filename = win.FileName;
            rootfile= filename;

            rootfile = filename;
            int index = rootfile.Length;

            index = index - 4;
            rootfile = rootfile.Remove(index);

            //Get file version for text box
            var fversion = FileVersionInfo.GetVersionInfo(filename);
            version = fversion.FileVersion;

            //get date created 
            DateTime fdate = File.GetCreationTime(filename);
            date = fdate.ToString();

            //Display Folder Contents
            showzip(filename);

            UpdateContents test = new UpdateContents(rootfile, true);

            UpdateContents directory = test.CreateDirectory(rootfile);          
        }
    }

在我的XAML代码中,我只有TreeViewObject。下面是xaml的快照。我知道我需要将Hierarchialdata添加到xaml但是作为mvvm的新手我不知道如何使用它。

        <DockPanel LastChildFill="True" Grid.Row="4">
        <TreeView DockPanel.Dock="Left" Margin="5,0,5,5" x:Name="foldersItem" ItemsSource="{Binding foldersItem}" >

        </TreeView>
    </DockPanel>

我只需要向正确的方向发送,似乎我的模型正在构建正确的树结构,但我不知道如何用mvvm显示它!代码现在只解压缩文件夹。

1 个答案:

答案 0 :(得分:0)

您需要使用HierarchicalDataTemplateTreeView自动将您的项目一直渲染到树的底部叶节点。

这是来自MSDN的一篇文章,解释了所有关于TreeView控件和HierarchicalDataTemplate对象的内容:How to: Use a TreeView to Display Hierarchical Data

对于MVVM和绑定,您需要密切了解INotifyPropertyChanged接口:System.ComponentModel.INotifyPropertyChanged

提示: VM中绑定的任何属性都应在其setter中引发PropertyChanged事件。此外,任何操作都应通过Command个对象(System.Input.ICommand实现)实现,而不是事件处理程序。

从基本原则中查看Kent Boogart关于MVVM的优秀教程:Kent Boogaart's blog - View Models: POCOs versus DependencyObjects