保存和加载数据" MVVM"道路
本文关键字:quot MVVM 道路 加载 保存 数据 | 更新日期: 2023-09-27 18:16:03
我目前正在做一个c# WPF项目,使用Telerik提供的一些控件,我尊重MVVM模式:
-
包含数据的模型
-
向View显示数据的ViewModel
显示数据的视图
当然,一些模型可以被重用并显示在几个视图中(在我的例子中,数据可以是显示在不同图上的形状的内容)。
现在我开始设计如何保存数据。我的目标很简单:当用户离开应用程序并返回时,所有视图必须在内容、颜色、字体、大小、空间位置等方面相同。
Saving a Model只覆盖了内容部分。如何保存显示属性,如颜色、字体、空间位置,特别是当几个视图将依赖于同一个模型时?我应该使用绑定并将所有属性从视图移动到模型吗?冒着模型复杂性会大大增加的风险吗?
你有任何解决方案,你保持UI属性从模型分离?
还有关于如何保存和加载数据"MVVM方式"的最佳实践吗?
我将用户选项保存在应用程序设置中。如果你不熟悉它们,你可以在MSDN的c#设置页面上找到完整的故事。简而言之,您可以拥有应用程序和用户设置,并且听起来您希望每个用户保存的用户设置。UI属性在任何模型中都没有位置,因为将这种信息与模型数据一起存储没有任何好处。你可以这样做:
private void LoadSettings(MainWindow window)
{
Settings.Default.Reload();
window.WindowStartupLocation = WindowStartupLocation.Manual;
window.Left = Settings.Default.ApplicationLocation.X;
window.Top = Settings.Default.ApplicationLocation.Y;
window.Width = Settings.Default.ApplicationSize.Width;
window.Height = Settings.Default.ApplicationSize.Height;
window.WindowState = Settings.Default.IsApplicationMaximised ? WindowState.Maximized : WindowState.Normal;
}
private void SaveSettings(MainWindow window)
{
Settings.Default.ApplicationLocation = new Point(window.Left, window.Top);
Settings.Default.ApplicationSize = new Size(window.Width, window.Height);
Settings.Default.IsApplicationMaximised = window.WindowState == WindowState.Maximized;
Settings.Default.Save();
}
将一些属性添加到基视图或主视图模型中可能更容易,这样您就可以与它们进行数据绑定:
public void SaveSettings(string tabName)
{
Settings.Default.ReleaseTrackSideFormat = StateManager.ReleaseTrackSideFormat;
Settings.Default.ReleaseLabelCopyFormat = StateManager.ReleaseLabelCopyFormat;
Settings.Default.ReleaseExportDestination = StateManager.ReleaseExportDestination;
Settings.Default.ReleaseSearchOptions = new SerializableReleaseSearchOptions(ReleaseSearchOptions);
...
Settings.Default.Save();
}
public void LoadSettings()
{
Settings.Default.Reload();
StateManager.ReleaseTrackSideFormat = Settings.Default.ReleaseTrackSideFormat;
StateManager.ReleaseLabelCopyFormat = Settings.Default.ReleaseLabelCopyFormat;
StateManager.ReleaseExportDestination = Settings.Default.ReleaseExportDestination;
ReleaseSearchOptions = new ReleaseSearchOptions(Settings.Default.ReleaseSearchOptions);
ReleaseExportSearchOptions = new ReleaseExportSearchOptions(Settings.Default.ReleaseExportSearchOptions);
...
}
更新>>>
你说得很对……您不会希望以这种方式存储模型数据。这用于与UI相关的用户首选项。如果您还在问如何保存您的模型数据,那么快速的答案是,我会将我的模型数据存储在数据库中,但这取决于您。你也可以很容易地将它存储在电脑的文件中。这一切都取决于规模、便利性、速度、对资源的访问等,所以这不是一个真正适合本网站范围的问题。然而,网上有很多教程一步一步地展示不同的保存数据的方法。要回答这个问题,我建议您遵循其中的一些。
我能告诉你的是,习惯上把你的数据访问代码放在一个单独项目(或一个小项目的文件夹)的类中。这个类通常只在父视图或基视图模型属性中被引用,所有的子视图模型都会通过This来访问它们的数据。也许像这样:
protected IModel Model
{
get { return model; }
}
然后子视图模型会这样使用它:
SomeCollectionProperty = Model.GetSomeData();
或:
Model.SaveSomeData(SomeCollectionProperty);
为了进一步澄清,在这个阶段,您对这个Model
类有什么实现没有区别。视图模型不关心它是使用数据库,还是一个普通的旧文本文件,只要它实现了GetSomeData
和SaveSomeData
方法。因此,最好在这里使用接口,特别是当您想要对视图模型进行任何测试时。
最后,您可能想看看我对WPF中MVVM的项目结构问题的回答,以更好地了解它。