保存和加载数据" MVVM"道路

本文关键字:quot MVVM 道路 加载 保存 数据 | 更新日期: 2023-09-27 18:16:03

我目前正在做一个c# WPF项目,使用Telerik提供的一些控件,我尊重MVVM模式:

  • 包含数据的模型

  • 向View显示数据的ViewModel

  • 显示数据的视图

当然,一些模型可以被重用并显示在几个视图中(在我的例子中,数据可以是显示在不同图上的形状的内容)。

现在我开始设计如何保存数据。我的目标很简单:当用户离开应用程序并返回时,所有视图必须在内容、颜色、字体、大小、空间位置等方面相同。

Saving a Model只覆盖了内容部分。如何保存显示属性,如颜色、字体、空间位置,特别是当几个视图将依赖于同一个模型时?我应该使用绑定并将所有属性从视图移动到模型吗?冒着模型复杂性会大大增加的风险吗?

你有任何解决方案,你保持UI属性从模型分离?

还有关于如何保存和加载数据"MVVM方式"的最佳实践吗?

保存和加载数据" 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类有什么实现没有区别。视图模型不关心它是使用数据库,还是一个普通的旧文本文件,只要它实现了GetSomeDataSaveSomeData方法。因此,最好在这里使用接口,特别是当您想要对视图模型进行任何测试时。

最后,您可能想看看我对WPF中MVVM的项目结构问题的回答,以更好地了解它。