Dav*_*VVM 9 c# wpf persistence save mvvm
我目前正在使用Telerik提供的一些控件来开发一个C#WPF项目,我尊重MVVM模式:
包含数据的模型
ViewModel将数据呈现给View
a显示数据的视图
当然,一些模型可以重复使用并显示在多个视图中(在我的例子中,数据可以是显示在不同图表上的形状的内容).
现在我开始设计如何保存数据.我的目标非常简单:当用户离开应用程序并返回时,所有视图在内容,颜色,字体,大小,空间位置方面必须相同...
保存模型仅涵盖内容部分.如何保存显示属性,如颜色,字体,空间位置,尤其是当多个视图依赖于同一模型时?我应该使用Bindings并将所有属性从View移动到模型吗?存在模型复杂性将大大增加的风险?
您是否有任何解决方案可以将UI属性与模型分开?
还有关于如何保存和加载"MVVM方式"数据的最佳实践吗?
提前致谢.
我将用户选项保存在应用程序设置中。如果您不熟悉它们,您可以在 上找到完整的故事如果您不熟悉它们,可以在 MSDN 上的“在 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();
}
Run Code Online (Sandbox Code Playgroud)
将一些属性添加到基本或主视图模型可能会更容易,以便您可以将数据绑定到它们:
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);
...
}
Run Code Online (Sandbox Code Playgroud)
更新>>>
你是对的......你不会想以这种方式存储你的模型数据。这是与 UI 相关的用户首选项。如果您还询问如何保存模型数据,那么简单的答案是我会将我的模型数据存储在数据库中,但这取决于您。您可以轻松地将其存储在计算机上的文件中。这一切都取决于规模、便利性、速度、对资源的访问等,所以这并不是一个真正适合本网站范围的问题。
然而,网上有很多教程逐步展示了保存数据的不同方法。为了回答这个问题,我建议您遵循其中的一些内容。
我可以告诉您的是,习惯上将数据访问代码放入单独项目(或小项目的文件夹)中的类中。然后,此类通常仅在父视图模型或基本视图模型属性中引用,并且所有子视图模型都将通过此访问其数据......也许是这样的:
protected IModel Model
{
get { return model; }
}
Run Code Online (Sandbox Code Playgroud)
然后子视图模型将像这样使用它:
SomeCollectionProperty = Model.GetSomeData();
Run Code Online (Sandbox Code Playgroud)
或者:
Model.SaveSomeData(SomeCollectionProperty);
Run Code Online (Sandbox Code Playgroud)
为了进一步澄清一点,在这个阶段,这个类的实现没有什么区别Model。视图模型不关心它是使用数据库还是纯旧文本文件,只要它实现GetSomeData和SaveSomeData方法即可。因此,最好在这里使用接口,特别是如果您想要对视图模型进行任何测试。
最后,您可能想看看我对WPF 中 MVVM 的项目结构问题的回答,以便更好地了解这一点。