在为一些学徒准备研讨会时,我遇到了在遵循 MVVM 模式时保存当前状态的问题。
环境
首先是本题使用的类图:
其次是GUI,因此您可以想象我希望用户做什么:
MainMV 为存在的每种成分(硬编码)创建一个 IngredientsVM,并将它们添加到列表中。 然后将此列表绑定(bind)到 UI。当用户更改复选框状态时,IngredientVM 的“IsChecked”属性会相应更改。
通过 UI 选择的配料被保存在 Pizza 对象中。所以比萨饼对象包含所选配料的列表。
问题
用户应该能够导出和导入他的选择。这听起来像是一件很容易做的事情,但问题出在我想用于此练习的 MVVM 模式上。
因为我有一个已设置的成分列表,所以我已经有了这些类的实例。如果我通过序列化保存和加载它们,我会得到序列化类的另一个实例。所以我最终得到了一个包含所有成分的列表和一个包含所选成分的列表,它们是两个不同对象!
可能的解决方案
我遇到了一些解决方案,但我不知道哪个最符合 MVVM 模式的想法:
- 根据导入的成分对象设置复选框状态。
这意味着我检查导入的成分名称是否与其中一个 IngredientVM 中的名称相同。如果是这样,我将 IsChecked 设置为 true。
但我觉得这是一种非常糟糕的编码方式。 - 序列化所有 IngredientVMs
我只是序列化了上一层。这样我就得到了所有成分及其状态(选中与否)。
此解决方案的缺点是,如果用户加载旧的保存文件,则只会加载旧的成分,因为它会使通常的“createIngrediants”过程过载。 - Only export the ids
在我看来,这是目前为止最合适的解决方案。我只导出所选成分的 ID。 (当然,我必须先将 id 添加到类中)在导入时,我只是在列表中查找 id 并将它们设置为已选中。
但不知何故,我觉得要将 id 添加到像成分这样简单的东西中错了……
那么,你们有没有更好的方法来解决这个问题?
感谢您的投入!
最佳答案
您肯定需要成分的 ID,这是肯定的。如果名称是唯一的,那么它工作得很好并且也是人类可读的,所以选项 3,在这种情况下与选项 1 相同。如果名称不是唯一的,例如您有不同类型的番茄或其他东西,您可以使用其他一些唯一标识符。
MVVM 处理 UI 与底层进程分离的方式,导入和导出数据不在其权限范围内,所以如果你问我,问题的标题有点误导。
关于c# - 模型组件的 MVVM 和序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36331980/