了解WPF -在模型或视图模型中存储数据

本文关键字:模型 存储 数据 视图 了解 WPF | 更新日期: 2023-09-27 18:18:54

我不确定在WPF应用程序中存储数据的位置。有两个原则可能会发生冲突。谁能把这弄清楚?

原则1:数据应该存储在模型中。
因此,例如,应该将ObservableCollection<string> Articles存储在Model中。ViewModel中的一个属性可以使它对视图可用。

原则2:依赖于视图的状态应该存储在ViewModel中。
这意味着具有相应属性string SelectedArticlestring _SelectedArticle变量应该存储在ViewModel中。

到目前为止,我只把不影响视图的方法或值放到了模型中,因为我(可能太)严格地遵循了原则2。但我不确定这是否是正确的方法。

我真的应该在模型中保留一些数据,在ViewModel中保留一些数据,还是有地方存储所有数据?

了解WPF -在模型或视图模型中存储数据

简单的回答是:数据应该存储在它所属的位置

  • 模型应该只包含数据本身——它可能包含从外部服务、用户输入、数据访问层和其他地方获得的数据。
  • ViewModels应该把将要呈现给用户的部分数据包装成合适的包装,以便用户能够查看和更改数据——公共属性、ObservableCollections等。如果你的应用中有许多相同数据的可视化表示,那么你必须为每一种表示(视图)构建合适的ViewModel。
  • View使用ViewModel,但另外可以拥有(并存储)一些验证(不是验证)逻辑和相关参数。

在您的情况下,模型应该有List<string> Articles。ViewModel将使用此列表并在构造函数中构建ObservableCollection<string> Articles。并且SelectedArticle也应该存储在ViewModel中,如果它的值仅用于在视图中导航,并且永远不会在模型中使用或在数据访问层的某个地方保存到DB。

模型应该包含所有需要保存的数据,因此,例如一个person对象,模型包含Firstname,姓,出生日期等。

viewmodel然后包装模型,适用于任何逻辑需要在视图和模型之间传递数据,所以如果你想我年龄字段然后你不保存在模型中你指示视图模型计算从捐赠并传递到视图,同样的业务规则验证等输入视图模型层面上发生,所以如果你的人必须是年满18岁你会检查出生日期之前保存的模型,你也可以使用视图模型进行更改跟踪所以如果你更改了第一个名字引发属性更改事件的是视图模型而不是模型

然后视图控制如何显示数据,因此指示哪些控件链接到ViewModel中的哪些属性

大多数可选控件都将其选定值定义为功能的一部分,因此如果您希望控件A显示控件B中选定的内容,则将控件A绑定到控件B的选定项属性

在你的情况下,我希望看到一个文章模型,控制数据库访问或web服务等

一个显示文章文本的ArticlesEditor ViewModel,允许使用Save和cancel方法对其进行更改,该方法要么从模型中重新加载原始文本,要么将更改后的文本复制到模型

然后是ArticlesList视图模型,该模型包含ArticlesEditor的可观察集合,并包含创建和删除文章的方法

那么在你的视图中,你将有一个绑定到ArticlesList的listview。Articles属性和编辑器控件绑定了ListViews。属性,编辑器控件的控件将被绑定到ArticlesEditor对象的属性

View所有可见的数据都应该存储在ViewModel中。只需使用调用业务逻辑的视图模型。如果您的实体没有映射到视图,则应该使用模型,如果您显示某些内容,则应该使用其视图模型。