我目前正在使用Telerik提供的一些控件开发C#WPF项目,并且我尊重MVVM模式:
包含数据的模型
向View提供数据的ViewModel
显示数据的视图
当然,有些模型可以重复使用并显示在多个视图中(在我的例子中,数据可以是不同图表上显示的形状内容)。
现在我开始设计如何保存数据。我的目标非常简单:当用户离开应用程序并返回时,所有视图在内容,颜色,字体,大小,空间位置方面必须相同...
保存模型仅涵盖内容部分。如何保存显示属性,如颜色,字体,空间位置,尤其是当多个视图依赖于同一模型时?我应该使用Bindings并将所有属性从View移动到模型吗?存在模型复杂性会大大增加的风险吗?
您是否有任何解决方案可以将UI属性与模型分开?
还有关于如何保存和加载数据的最佳实践" MVVM方式" ?
提前致谢。
答案 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
类的实现没有任何区别。视图模型不关心它是使用数据库还是普通的旧文本文件,只要它实现GetSomeData
和SaveSomeData
方法即可。因此,最好在这里使用一个接口,特别是如果你想对视图模型进行任何测试。
最后,您可能需要查看我对Project structure for MVVM in WPF问题的回答,以便更好地了解这一点。