2014-08-29 45 views
0

命中一堵墙,我是新的MVVM结构,需要帮助显示我的树。我需要显示一个像树一样的文件浏览器。在我转移到mvvm后,我的树停止显示。我用它里面的方法建立了一个模型来构建一个文件树。下面是我的模型。可选的TreeView文件浏览器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显示它!该代码现在仅解压缩文件夹。

+0

好文章[MVVM(http://www.c-sharpcorner.com/UploadFile/raj1979/simple-mvvm-pattern-in- WPF /)。最重要的部分 - “INotifyPropertyChanged”。另外,你的绑定现在是错误的。 – cdmnk 2014-08-29 23:01:27

回答

0

您需要使用HierarchicalDataTemplate才能让TreeView自动将项目渲染到树的底部叶节点。

下面是从MSDN explaing所有关于TreeView控制和HierarchicalDataTemplate对象的一篇文章:How to: Use a TreeView to Display Hierarchical Data

也为MVVM和绑定您需要了解紧密INotifyPropertyChanged接口:System.ComponentModel.INotifyPropertyChanged

提示:任何属性绑定在虚拟机上应该会引发PropertyChanged事件。还应该通过Command对象(System.Input.ICommand实现)执行任何操作,而不是事件处理程序。

从基本原理退房肯特Boogart对MVVM优秀教程:Kent Boogaart's blog - View Models: POCOs versus DependencyObjects