c# - 保存和加载数据 "the MVVM"的方式?

标签 c# wpf mvvm save persistence

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

  • 包含数据的模型

  • 将数据呈现给 View 的 ViewModel

  • 显示数据的 View

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

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

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

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

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

提前致谢。

最佳答案

我在应用程序设置中保存这样的用户选项。如果您不熟悉它们,可以在 Using Settings in C# 上找到完整的故事。 MSDN 上的页面。简而言之,您可以拥有应用程序和用户设置,这听起来像是您希望为每个用户 保存的用户设置。 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();
}

将一些属性添加到基本或主视图模型可能更容易,这样您就可以将数据绑定(bind)到它们:

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 相关的用户首选项。如果您还询问如何保存模型数据,那么快速的回答是我会将我的数据存储在数据库中,但这取决于您。您可以轻松地将其存储在计算机上的文件中。这一切都取决于规模、便利性、速度、资源获取等,所以这不是一个真正适合本网站范围的问题。

但是,网上有很多教程逐步展示了保存数据的不同方法。要回答那个问题,我建议您阅读其中的一些内容。

我可以告诉您的是,习惯上将您的数据访问代码放入单独项目(或小项目的文件夹)的类中。此类通常仅在父 View 模型属性或基础 View 模型属性中引用,所有 subview 模型都将通过此访问它们的数据......也许是这样的:

protected IModel Model
{
    get { return model; }
}

然后 subview 模型会像这样使用它:

SomeCollectionProperty = Model.GetSomeData();

或者:

Model.SaveSomeData(SomeCollectionProperty);

进一步澄清一下,在这个阶段,您对该 Model 类的实现没有区别。 View 模型不关心它是使用数据库还是纯文本文件,只要它实现了 GetSomeDataSaveSomeData 方法即可。因此,最好在此处使用接口(interface),尤其是当您想要对 View 模型进行任何测试时。

最后,您可能想看看我对 Project structure for MVVM in WPF 的回答问题也可以对此有更好的了解。

关于c# - 保存和加载数据 "the MVVM"的方式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25083317/

相关文章:

wpf - 如何创建自定义 WPF 安装向导

ios - 如何在 MVVM 模型中使用 MKMapViewDelegate 方法

android - Android 中的 MVVM 存储库

c# - 如何使用 LINQ 对集合进行排序,以便首先出现特定字符串

c# - 使用 Azure 服务总线发送消息时身份验证失败

c# - 如何基于 Func<T> 将 IObservable<T> 窗口化/缓冲到 block 中

c# - 添加可变数量的控件

c# - Visual Studio C# 工具箱无法在 Windows 窗体应用程序上运行

C#/WPF - 重新编译 SilverLight 4 工具包以用于 WPF 应用程序是否可行?

c# - ReactiveUI - 为什么简单的 ReactiveList.Changed -> ToProperty 不起作用?