WPF/MVVM TreeView 与 XML 数据的保存与加载

在现代的.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="保存按钮截图">

应用程序会显示一个标准的保存对话框,包含两种文件模式选项:

  • *.solxml
  • *.solsqlite

如果更喜欢二进制关系数据格式,请选择*.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()方法,如果它们像之前讨论的那样被处理。

反馈与问题

  1. 高级WPFTreeViews - 第1部分
  2. 高级WPF TreeViews - 第2部分
  3. C#/VB.Net中的高级WPFTreeViews - 第3部分
  4. C#/VB.Net中的高级WPF TreeViews - 第4部分
  5. C#/VB.Net中的高级WPFTreeViews - 第6部分
  6. C#/VB.Net中读取和写入XML
  7. C#/VB.Net中使用SQLite
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485