c# - MVVM Light 的“黄金”实现
问题描述
问题可以总结为:在 UWP 上使用 MVVM Light 开发清晰的应用程序的最佳方式是什么?也许我错过了,但我没有找到样本或类似的东西……</p>
我看到了很多讨论和变化: 模型——我是只放数据还是应该创建 e DAL 模型?如果我使用 EF,我需要 2 层(DAL 和模型)吗?
它应该是可观察的吗?加载/保存或填充方法应该在此处还是在 DAL 中?
然后我们进入更高的层次:如果你有一个类中的列表(例如公司 - 员工),那么 List 对象是在模型中还是在 ViewModel 中?
但是,如果我有模型公司和通过 EF 上的 LINQ 收集的公司列表(列表),我该如何将其转换为ObservableCollection<CompanyViewModel>
? 我应该做一个循环并添加新对象吗?不是很有效和很好......没有更好的方法吗?
模型会引发 ContentChanged 吗?(在我看来答案是否定的,它应该由视图模型提出)
对于 ViewModel,您是根据视图(主窗体 ViewModel、TreeView ViewModel)还是数据(CompanyViewModel
)映射视图模型?或两者兼而有之(在这种情况下为什么?)?
所有的 ViewModel 都应该是可观察的,所以所有的动作都应该在此处或下方引发内容更改?
我已经看到了所有可能的答案,所以这就是我要问的原因:; 哪个是“黄金”方式?“最佳实践”?我知道几乎所有这些都“可以工作”,但我的目标是了解“最好的”(= 更高效,从设计角度来看更干净,等等......)。
解决方案
在将数据源中的更改传播到 UI 的情况下,您建议的循环和添加新对象的解决方案并不像听起来那么糟糕。如果您的数据源包含允许您仅过滤实际更改的“上次更改”属性,则您只能获取更改的数据。否则,无论如何您都必须查询全部项目数,因此对数据进行另一个循环不会改变复杂性(仍然与项目数成线性关系)。如果您有某种 ID,则可以检查是否存在此类 ID,ObservableCollection
然后添加它。
对于您的第二个问题,根据我的经验,您构建和划分视图模型的方式是个人喜好,并且可能因情况而异。我通常有一个页面的视图模型,然后还创建视图模型来包装数据模型(例如列表项等)。但是,如果视图模型变得更加复杂,我通常会对其进行分区并创建负责 UI 特定区域的视图模型。然后可以将这些作为页面本身的视图模型的属性进行访问 - 这样您就可以正确分离关注点。
推荐阅读
- python - 如何在不创建本地副本的情况下从在线 gzip 文件中读取数据?
- lambda - 如何为 serverless.yml 中的所有功能设置默认授权人
- html - 根据父 div 更改嵌套子 div
- php - Codeigniter - 不显示任何数据
- arrays - 使用Angular从具有另一组值的数组中查找匹配值的最佳方法
- c# - 如何通过 linq 查询读取所有代码并保存到单个集合中
- android - 在我按下android中的按钮之前如何使任何视图增长。(kotlin或java无关紧要)?
- php - 提交 POST 表单后使用 PHP 顺利重新加载表格
- javascript - 如何在javascript中比较两个日期
- javascript - 捕获匹配的第一个或第二个实例