撞墙,我是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显示它!代码现在只解压缩文件夹。
答案 0 :(得分:0)
您需要使用HierarchicalDataTemplate
让TreeView
自动将您的项目一直渲染到树的底部叶节点。
这是来自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