在现代的.NET应用程序开发中,WPF(Windows Presentation Foundation)提供了丰富的用户界面元素,其中TreeView是一个常用的控件,用于展示层次结构数据。而MVVM(Model-View-ViewModel)模式则是一种设计模式,用于分离用户界面和业务逻辑,使得代码更加清晰和易于维护。本文将介绍如何在WPF应用程序中使用MVVM模式来保存和加载TreeView控件的内容到XML文件。
在之前的文章中,已经讨论了在C#/VB.Net中读取和写入XML的不同选项。本文将在此基础上,提供一个实际的示例,演示如何创建一个类似于Visual Studio中“解决方案资源管理器”的工具窗口。
可以直接下载附带的示例代码,然后在Visual Studio 2017 Community中打开项目,恢复NuGet包,编译并运行。如果有任何问题,可以在论坛中提问。
应用程序的主窗口如下截图所示:
<img src="main_window_screenshot.png" alt="应用程序主窗口截图">
可以使用上下文菜单(如上图所示)来排列TreeView中的项目。使用保存按钮(如下图所示)来保存TreeView的内容。
<img src="save_button_screenshot.png" alt="保存按钮截图">
应用程序会显示一个标准的保存对话框,包含两种文件模式选项:
如果更喜欢二进制关系数据格式,请选择*.solsqlite选项。如果想要保存和加载TreeView的内容为纯XML,请选择*.solxml选项。
数据的重新加载使用相同的工作流程,但使用加载按钮。
下面的序列图展示了在保存XML数据时参与交互的主要对象之间的工作流程:
<img src="sequence_diagram.png" alt="序列图">
MainWindow.xaml中的按钮点击会触发绑定的ICommand SaveSolutionCommand属性,在AppViewModel类中,进而显示标准的文件保存对话框,让用户选择文件名、位置和格式。
AppViewModel.Save_SolutionCommand_Async()方法然后将视图模型转换为模型,如之前讨论的SQLite数据格式:
public static void WriteXmlToFile(string filename, ISolutionModel rootModel)
{
XmlWriter xmlWriter = null;
try
{
var fileStream = new FileStream(filename, FileMode.Create);
xmlWriter = XmlWriter.Create(fileStream,
new XmlWriterSettings
{
Indent = true,
IndentChars = "\n",
CloseOutput = true
});
var dataContractSerializer = new DataContractSerializer(typeof(SolutionModel));
dataContractSerializer.WriteObject(xmlWriter, rootModel);
}
finally
{
if (xmlWriter != null)
xmlWriter.Close();
}
}
WriteXmlToFile()方法与之前用于加载和保存XML的方法非常相似,如在DataContractSerializer_V1.zip示例中所示。Storage类中的上述代码评估ModelRoot并看到IXmlSerializable接口。因此,DataContractSerializer调用ModelRoot.WriteXml()方法,此调用处理所有其他TreeView项目的...WriteXml()方法,如果它们像之前讨论的那样被处理。