C# MVVM应用程序中用户配置数据的实用管理

C# MVVM应用程序中用户配置数据的实用管理,c#,mvvm,config,desktop-application,C#,Mvvm,Config,Desktop Application,我正在开发一个桌面应用程序,作为我们客户的IDE。此应用程序允许用户配置可编程设备并将其集成到其产品中 我正在寻找在这样的MVVM应用程序中管理持久数据的最佳实践/设计模式。一些数据在用户的项目之间可能是可重用的,因此我希望独立地存储这些数据,而不是存储在一个大文件中。这个场景使我考虑VisualStudio处理这个方法(指向项目的文件的.cProjJ文件)。< /P> 在考虑VisualStudio方法时,我可以轻松地为自己的数据实现这样的对象,并将其序列化为XML。然而,当涉及到打开和操作这

我正在开发一个桌面应用程序,作为我们客户的IDE。此应用程序允许用户配置可编程设备并将其集成到其产品中

我正在寻找在这样的MVVM应用程序中管理持久数据的最佳实践/设计模式。一些数据在用户的项目之间可能是可重用的,因此我希望独立地存储这些数据,而不是存储在一个大文件中。这个场景使我考虑VisualStudio处理这个方法(指向项目的文件的.cProjJ文件)。< /P> 在考虑VisualStudio方法时,我可以轻松地为自己的数据实现这样的对象,并将其序列化为XML。然而,当涉及到打开和操作这个项目文件指向的文件时,我真的很难找到一个优雅的解决方案

例如,我打开项目文件,对其进行反序列化,留下一个包含路径的对象,以及一些元数据,如CompanyName、ProductName等。下一步:打开/反序列化项目文件中指向的每个文件。。。但是这些物体应该生活在哪里呢?您应该如何通知ViewModels该模型已在外部更改?直觉告诉我,任何独特模型都应该只有一个实例,以避免副本不同步的问题,但这就是我所拥有的

也许有一个框架可用于此


也许有一篇很好的文章可以回答这个问题,但我不知道如何搜索它。任何建议都将不胜感激。

应用程序特定的设置应使用Visual Studio和.Net中内置的正常设置(项目属性上的“设置”选项卡)进行存储。这将为您提供版本控制、升级等功能


特定于每个项目的设置需要存储在项目本身中

要成为一个好的企业公民,您应该在用户的Documents目录下创建一个文件夹,然后如果每个项目有多个工件,那么它可能有自己的子文件夹,或者如果项目的所有内容都是一个文件,那么我猜只有一个平面目录

你问题的另一部分不清楚。你是说一个.cs文件如何在外部编辑到VS,然后VS自动重新加载它?如果是这样的话,您只需在打开项目时设置一个文件更改通知监视

编辑:

视图模型通常不应该相互引用,除非您将实现INPC的poco称为“视图模型”,而我实际上并不这么认为。视图模型对我来说基本上就是XAML视图的数据上下文

就VM相互通信而言,最好保持松散耦合并使用messenger模式。大多数MVVM框架都有messenger实现。您将IMessenger或他们使用的任何接口输入到您的VM中,然后
IMessenger.Subscribe()
(MVVM框架的语法明显不同,但通常您会得到一条X类型的消息,并添加一个事件处理程序或调用send方法),例如,并获取该类型的通知。启动消息的VM将新建OpenMessage并将其发送给messenger,以将其分发给需要它的VM


对于您的CsProj场景,您需要将这些设置存储在项目文件中并反序列化。

至于“您应该如何通知ViewModels该模型已在外部更改?”,答案是
INotifyPropertyChanged
@BradleyUffner,要使其工作,我的模型需要是某个类上的属性,该类必须实现
INotifyPropertyChanged
(听起来像是一个视图模型)。我的问题是,我的模型是什么类的?提醒:我有多个ViewModels绑定到一个给定的模型,所以我不知道您的答案如何解决我的问题。抱歉,这不是我在问题中的意图。我的意思是,当我打开一个现有文件,然后反序列化它并将其分配给模型时,我应该如何通知引用该模型的所有ViewModels?在我以前开发的所有应用程序中,它们都比较简单,所有对模型的访问都是通过ViewModel完成的。在这里,我有多个ViewModels访问一个模型。另外,我的问题不是关于应用程序设置。考虑VisualStudio类比:我希望我的用户能够创建他们自己的项目(比如.CSPROJ文件),向他们的项目中添加各种类型的新项目(例如C项目中的CS文件),以及在多个项目之间重用这些项目(比如将现有的.CS源文件作为链接链接到C项目)。.@自动-查看我的更新答案。这就清楚了吗?谢谢你的更新。在研究这个问题时,我已经阅读了Messenger模式(以及事件总线),但我不确定它是否对我的用例是必要的/可取的。我得到的印象是,这种模式使您的应用程序难以遵循和调试。你以前应用过这种模式吗?如果是这样,它可行吗?@我一直在自动使用它。我喜欢它,如果你相信:)。这是使WPF/MVVM在imo中“光滑”的一部分。它使一切保持解耦。不太难调试/遵循。一个视图发送消息,关心它的视图订阅消息。调试只是在事件处理程序上设置断点。如果您改变周围的视图,则解耦效果非常好。