如何通过控制器将选项卡中的数据发送/加载到MVVM模式中的另一个选项卡(JavaFx 8)

时间:2016-05-26 14:04:07

标签: mvvm tabs javafx-8 fxml

我在JavaFx 8中开发了一个项目,在那里我可以将数据从一个选项卡发送或加载到另一个选项卡。现在我想以MVV模式开发相同的项目。 现在我为每个选项卡和主控制器创建了一个视图,viewmodel和model,它应该处理其他选项卡。

Tab1

我可以在tab1和tab2中设置文本,但我不知道如何构建maincontroller model / modelview来处理从tab1到tab2的数据。如果我想将mainconcontrollerview绑定到maincontrollermodel,我不能因为fxml注释。

在maincontroller视图中包含了另外两个视图。我提供了类和fxml文档,以便更好地理解我到目前为止所做的工作以及我的问题可能存在的地方

MVVM TabTest link

2 个答案:

答案 0 :(得分:1)

不应试图重新发明轮子,而应该看看实现MVVM模式的框架,并提供组件之间通信的必要手段。

https://github.com/sialcasa/mvvmFX

答案 1 :(得分:0)

1)您的代码中存在一些关于MVVM的误解。 MVVM中的“视图”由两部分组成:FXML文件和“CodeBehind”类。 codeBehind类是具有@FXML注释的UI控件引用的类。然后,codeBehind类将UI控件连接到ViewModel的属性。因此,“viewmodel”包中的类实际上是属于“View”的codeBehind类。你的“模型”包中的类实际上是你的“ViewModels”。

2)在你的例子中,每个标签codeBehind类都有一个对主codeBehind类的引用,主codeBehind引用了每个标签codeBehind,这意味着你有一个非常紧密的耦合。对于父组件,可以知道它的子组件,但子组件不应该知道它们的使用位置和方式。

3)我是mvvmFX框架的开发人员之一。就像mipa所说的那样,这个框架为这种情况提供了一些帮助和实用工具。我认为有两种方法可以做到这一点:

  1. 您应该使用dependency-injection。这样在主视图模型中,您可以获得对两个选项卡viewModel的引用并连接它们,而不需要codeBehind类相互了解。
  2. 在框架的最后一个版本中,我们引入了一个beta功能,我们称之为“范围”。它基本上是一个缩进的类,用于保存多个viewModel使用的数据。 ViewModels可以注入范围实例并使用此数据(例如通过数据绑定)。这样,ViewModel不需要直接了解其他ViewModel,只知道Scope实例。在稍后的时间点添加新选项卡时,不需要更改现有类。您可以找到更多here