保存并加载数据" MVVM"办法?

时间:2014-08-01 15:12:10

标签: c# wpf mvvm save persistence

我目前正在使用Telerik提供的一些控件开发C#WPF项目,并且我尊重MVVM模式:

  • 包含数据的模型

  • 向View提供数据的ViewModel

  • 显示数据的视图

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

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

保存模型仅涵盖内容部分。如何保存显示属性,如颜色,字体,空间位置,尤其是当多个视图依赖于同一模型时?我应该使用Bindings并将所有属性从View移动到模型吗?存在模型复杂性会大大增加的风险吗?

您是否有任何解决方案可以将UI属性与模型分开?

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

提前致谢。

1 个答案:

答案 0 :(得分:4)

我在“应用程序设置”中保存了类似的用户选项。如果您不熟悉它们,可以在MSDN上的Using Settings in 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相关的用户首选项。如果您还询问如何保存模型数据,那么快速回答是我将我的数据存储在数据库中,但这取决于您。您可以轻松地将其存储在计算机上的文件中。这一切都取决于规模,便利性,速度,资源访问等,所以它并不是一个适合本网站范围的问题。

但是,有很多在线教程显示了逐步保存数据的不同方法。要回答那个问题,我建议您按照其中的一些进行操作。

我可以告诉您的是,习惯上将您的数据访问代码放入单独项目(或小项目的文件夹)中的类中。然后,此类通常仅在父视图或基本视图模型属性中引用,并且所有子视图模型都将通过此类访问其数据...可能是这样的:

protected IModel Model
{
    get { return model; }
}

然后子视图模型会像这样使用它:

SomeCollectionProperty = Model.GetSomeData();

或者:

Model.SaveSomeData(SomeCollectionProperty);

为了进一步说明,在这个阶段,你对这个Model类的实现没有任何区别。视图模型不关心它是使用数据库还是普通的旧文本文件,只要它实现GetSomeDataSaveSomeData方法即可。因此,最好在这里使用一个接口,特别是如果你想对视图模型进行任何测试。

最后,您可能需要查看我对Project structure for MVVM in WPF问题的回答,以便更好地了解这一点。