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

时间:2019-03-17 13:09:37

标签: javafx design-patterns mvvm data-binding mvvmfx

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?谁能解释该案该怎么办?

1 个答案:

答案 0 :(得分:1)

有两种解决方案各有优缺点。

如果您想对MVVM模式保持100%真实,则View可能不知道任何模型类。因此,不允许将ViewProperty中的personProperty赋予View。相反,您必须将模型类的字段复制为ViewModel中的属性,例如“ firstnameProperty”。现在可以在视图中使用这些属性(通常通过数据绑定)。 View对模型类“ Person”一无所知。相反,它只知道ViewModel提供的属性。
但是,现在您必须使这些属性与ViewModel中的实际模型实例保持同步。为了使此操作变得容易一些,我在mvvmFX框架中创建了ModelWrapper util。除了经典的Java POJO之外,它还支持具有JavaFX属性的类。您可以在类here的测试中看到一个用法示例。它使用具有JavaFX属性(here)的Model类。 这是推荐的方法。但是,根据模型类的复杂性,这可能会很棘手。对于具有深层结构的复杂模型,您可能需要编写自己的逻辑以使属性与模型类保持同步。这是MVVM模式中最棘手的部分之一。

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