当模型具有 JavaFX 属性时如何使用 ViewModel?

How to use ViewModel when Model has JavaFX properties?

Here据说我们有 2 个选项来使用 JavaFX 实现 MVVM - 这取决于我们是否想在我们的模型中使用 JavaFX-Properties。

据我了解,如果我的模型没有 javafx 属性,那么我会将 fx 属性添加到 ViewModel。但是,如果我的模型具有 fx 属性,我不明白我应该怎么做。这种情况我该怎么办?像这样:

class ViewModel {
   private ObjectProperty<Person> personProperty = new SimpleObjectProperty<>();
   ...
   personProperty.set(person);
}

或者我应该复制 ViewModel 中 Person 的所有属性并将每个 ViewModel 属性 绑定到 Person 属性,以获得 View -><- ViewModel -><- Model?谁能解释一下这个案例该怎么办?

有 2 种解决方案,各有优缺点。

如果您想 100% 忠实于 MVVM 模式,您的视图可能不知道任何模型 classes。因此不允许将 personProperty 从 ViewModel 提供给 View。相反,您必须将模型 class 的字段复制为 ViewModel 中的属性,例如 "firstnameProperty"。这些属性现在可以在视图中使用(通常通过数据绑定)。视图对模型 class 'Person' 一无所知。相反,它只知道 ViewModel 提供的属性。
但是,现在您必须使这些属性与 ViewModel 中的实际模型实例保持同步。前段时间为了让这更容易,我创建了 ModelWrapper util as part of the mvvmFX framework. In addition to classic Java POJOs it also supports classes with JavaFX Properties. You can see the a usage example in the tests of the class here. It uses a Model class with JavaFX properties (here)。 这是推荐的方法。但是,根据模型的复杂性 classes,这可能会变得棘手。对于具有深层结构的复杂模型,您可能需要编写自己的逻辑以使属性与模型 classes 保持同步。这是 MVVM 模式中最棘手的部分之一。

另一种方法是放宽MVVM模式的限制,将Model实例传递给View。如果您的模型 class 有很多字段并且复制 ViewModel 中的每个字段会需要很多代码,这可能是一个解决方案。但是,通过这种方式,您引入了从视图到模型的依赖关系,这又是 MVVM 的想法。