【发布时间】:2014-09-24 20:08:45
【问题描述】:
我目前正在使用 Telerik 提供的一些控件进行 C# WPF 项目,我尊重 MVVM 模式:
包含数据的模型
将数据呈现给视图的 ViewModel
显示数据的视图
当然,某些模型可以重复使用并显示在多个视图中(在我的情况下,数据可以是显示在不同图表上的形状的内容)。
现在我开始设计如何保存数据。我的目标很简单:当用户离开应用程序并返回时,所有视图在内容、颜色、字体、大小、空间位置等方面都必须相同......
保存模型仅涵盖内容部分。您将如何保存显示属性,如颜色、字体、空间位置,尤其是当多个 View 依赖于同一个 Model 时?我应该使用 Bindings 并将所有属性从 View 移动到 Model 吗?有模型复杂度会大大增加的风险吗?
您有什么解决方案可以将 UI 属性与模型分开吗?
还有关于如何“以 MVVM 方式”保存和加载数据的最佳实践吗?
提前致谢。
【问题讨论】:
-
是的,你是对的,你应该将所有这些属性移动到你的模型中。
-
视图相关的东西就是视图相关的东西。您可以创建一些服务接口或方法,它们与您的模型在相同或不同的持久层上工作,并在与视图相关的代码隐藏中使用此服务(或方法)来保存/加载 UI 状态。但是我不会将模型和视图模型与完全纯粹与视图相关的东西混合在一起。 (我说的是虚拟机不应该关心的东西,例如文本是否是黑底白字而不是白底黑字,或者用户是否使可调整大小的面板比另一个大一点。 ..)
-
@elgonzo :我比我更喜欢您的解决方案,因为您将“业务”属性和“显示”属性分开。但是当我如此努力地将其保持在最低限度(如 DataContext)时,添加代码隐藏让我感到难过。您是否阅读过任何描述您的服务接口或方法的文章或博客文章?
-
对于服务/方法,我只是指一些工具来加载/保存您的设置(就像您有类似数据服务的东西来加载/保存/持久化您的模型)。我通常做的是让一个类型具有一个(单例)实例,可通过
UISettings.Instance之类的静态属性访问。此实例可能具有带有 UI 设置的属性或特定于某些窗口/UI 元素的进一步“配置容器”。然后,在 XAML 中,您可以访问类似"{Binding SomeProperty, Source={x:Static local:UISettings.Instance}}"的 UI 设置(也许您还需要声明 TwoWay 模式) -
另一方面,您可以直接使用设置工具,而不是旋转您自己的 UISettings 类(就像我一样,但话又说回来,我们的应用程序有点大,并且有一些阴暗的历史......)在您的 C# 项目中默认提供(请参阅 Sheridan 的回答)。绑定到 Settings 对象将类似于我之前所说的:
"{Binding SomeProperty, Source={x:Static YourNamespace:Settings.Default}}"(YourNamespace 将是类似于 YourProject.Properties 命名空间的命名空间)
标签: c# wpf mvvm save persistence