gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 17:56:08 25 4
gpt4 key购买 nike

我目前正在使用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com