【问题标题】:How to use ViewModel when Model has JavaFX properties?当 Model 具有 JavaFX 属性时如何使用 ViewModel?
【发布时间】:2019-03-17 13:09:37
【问题描述】:

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 -&gt;&lt;- ViewModel -&gt;&lt;- Model?谁能解释一下这种情况该怎么办?

【问题讨论】:

  • 我不知道我是否真正理解了这个问题,但这是我的两分钱。以这种方式使用的属性通常用于跟上TableViewListView 中的选择。 @James_D 有一个很好的例子here
  • @Sedrick 您提供的链接是关于MVC。我的问题是关于MVVM,这是一个完全不同的模式。

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


【解决方案1】:

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

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

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

【讨论】:

  • 我再次阅读了您的回答,我的脑海中出现了以下问题 - 表格呢?表在View中,但是表怎么不知道Model(表中显示了哪些实例)?据我了解,在这种情况下,ViewMode 具有模型的 ObservableCollection,但构建单元格(来自模型字段)的代码位于视图中,因此视图知道模型。你能解释一下吗?
  • @Pavel_K 一种解决方案是创建一个单独的类(即PersonTableViewModel)。此类充当模型和视图之间的数据传输对象。它包装了实际的模型实例,并为表的所有列提供了 getter。 parent-ViewModel 为视图提供了这些 table-VM 的 observableList。你可以看到一个例子here。此类还可以增强表格视图的值。
猜你喜欢
  • 2021-08-13
  • 2013-05-03
  • 1970-01-01
  • 2020-01-06
  • 1970-01-01
  • 2021-11-09
  • 1970-01-01
  • 2014-01-12
  • 2021-03-06
相关资源
最近更新 更多