Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/267.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# “保存和加载数据”;“MVVM”;路?_C#_Wpf_Mvvm_Save_Persistence - Fatal编程技术网

C# “保存和加载数据”;“MVVM”;路?

C# “保存和加载数据”;“MVVM”;路?,c#,wpf,mvvm,save,persistence,C#,Wpf,Mvvm,Save,Persistence,我目前正在使用Telerik提供的一些控件进行一个C#WPF项目,我尊重MVVM模式,包括: 包含数据的模型 向视图显示数据的视图模型 显示数据的视图 当然,一些模型可以重用并显示在多个视图中(在我的例子中,数据可以是不同图表上显示的形状的内容) 现在我开始设计如何保存数据。我的目标很简单:当用户离开应用程序并返回时,所有视图在内容、颜色、字体、大小、空间位置等方面都必须相同 保存模型仅包括内容部分。如何保存显示属性,如颜色、字体、空间位置,尤其是当多个视图依赖于同一模型时?我应该使用绑定并

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

  • 包含数据的模型

  • 向视图显示数据的视图模型

  • 显示数据的视图

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

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

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

您是否有将UI属性与模型分开的解决方案

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


提前感谢。

我会在应用程序设置中保存类似的用户选项。如果您不熟悉它们,可以在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();
}
将某些属性添加到基础或主视图模型中可能更容易,以便可以将数据绑定到它们:

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();
然后子视图模型将使用它,如下所示:

protected IModel Model
{
    get { return model; }
}
SomeCollectionProperty = Model.GetSomeData();
或:

进一步澄清一下,在这个阶段,对于这个
模型
类,您有什么实现是没有区别的。视图模型不关心它是使用数据库还是纯文本文件,只要它实现了
GetSomeData
SaveSomeData
方法。因此,在这里使用一个接口是很好的,特别是如果您想要对视图模型进行任何测试的话


最后,您可能想看看我对这个问题的回答,以便更好地了解这一点。

是的,您是正确的,您应该将所有这些属性移动到您的模型中。与视图相关的内容就是与视图相关的内容。您可以创建一些服务接口或方法,这些服务接口或方法与您的模型在相同或不同的持久层上工作,并在与视图相关的代码中使用此服务(或方法)来保存/加载UI状态。但我不会将模型和视图模型与完全和纯粹与视图相关的东西混为一谈。(我所说的内容应该与VM无关,例如,文本是否是黑白相间的,而不是黑白相间的,或者用户是否使一个可调整大小的面板比另一个稍大……。@elgonzo:我更喜欢您的解决方案,因为您将“业务”属性和“显示”的。但当我努力将代码保持在最低限度(如DataContext)时,添加代码却让我很难过。你读过任何描述你的服务接口或方法的文章或博客文章吗?使用服务/方法,我只是指一些加载/保存设置的工具(就像你有一个数据服务来加载/保存/持久化你的模型一样)。我通常做的是让一个类型有一个(singleton)实例可通过静态属性(如
UISettings.instance
)访问。此实例可以具有特定于某些windows/UI元素的UI设置或进一步的“配置容器”属性。在XAML中,您可以访问这样的UI设置
“{Binding SomeProperty,Source={x:static local:UISettings.instance}”“
(也许您也需要声明双向模式)另一方面,您可以直接使用C#项目中默认提供的设置功能,而不是旋转您自己的UISettings类(正如我所做的,但我们的应用程序有点大,并且有一些可疑的历史…)(请参见Sheridan的回答)绑定到设置对象与我之前所说的类似:{绑定某些属性,源={x:static YouNeStPosith:Studio,默认}“< /Cord>”(您的命名空间将是类似于YouTejial.FraseNosiSype的命名空间),我不确定我们是否可以考虑“显示”。我的项目的属性是用户设置。假设应用程序将显示一个包含20个形状的图表。每个形状都绑定到模型中保存的内容。并且您希望保存每个形状在空间中的位置。是否使用用户设置?