Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
当模型具有JavaFX属性时,如何使用ViewModel?_Javafx_Design Patterns_Mvvm_Data Binding_Mvvmfx - Fatal编程技术网

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

当模型具有JavaFX属性时,如何使用ViewModel?,javafx,design-patterns,mvvm,data-binding,mvvmfx,Javafx,Design Patterns,Mvvm,Data Binding,Mvvmfx,据说我们有两个选项可以使用JavaFX实现MVVM——这取决于我们是否希望在模型中使用JavaFX属性 据我所知,如果我的模型没有javafx属性,那么我会将fx属性添加到ViewModel中。但是,如果我的模型具有fx属性,我不明白该怎么办。这个案子我该怎么办?大概是这样的: class ViewModel { private ObjectProperty<Person> personProperty = new SimpleObjectProperty<>();

据说我们有两个选项可以使用JavaFX实现MVVM——这取决于我们是否希望在模型中使用JavaFX属性

据我所知,如果我的模型没有javafx属性,那么我会将fx属性添加到ViewModel中。但是,如果我的模型具有fx属性,我不明白该怎么办。这个案子我该怎么办?大概是这样的:

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

或者我应该复制ViewModel中Person的所有属性,并将每个ViewModel属性绑定到Person属性,以获得视图->有两种解决方案,各有优缺点

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


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

我不知道我是否真正理解这个问题,但这是我的两分钱。以这种方式使用的属性通常用于跟踪TableView或ListView中的选择@James_D有一个很好的例子。@Sedrick您提供的链接是关于MVC的。我的问题是关于MVVM的,这是一个完全不同的模式。我再次阅读了你的答案,下面的问题浮现在我的脑海中——关于表格呢?该表在视图中,但该表如何不知道该表中显示了哪些模型实例?正如我在本例中所理解的,ViewMode具有模型的ObservableCollection,但是从模型字段构建单元的代码在视图中,因此视图知道模型。你能解释一下吗?@Pavel_K一个解决方案是创建一个单独的类,即PersonTableViewModel。此类的作用类似于模型和视图之间的数据传输对象。它包装了实际的模型实例,并具有表中所有列的getter。父视图模型为视图提供这些表VM的可观察列表。你可以看到一个例子。此类还可以增强表视图的值。