将视图绑定到更改的控制器属性

我在TornadoFX图书馆工作在Kotlin。 想象一下你有一个工具栏,显示当前视图有用的工具。 所以我们有一个MainController,它有一个subController属性,它是工具栏旁边一些视图的控制器。 所以如果我们的子控制器改变,视图应该更新。 此外,如果子控制器的任何属性(例如selectedTool,tools)发生更改,则工具栏应相应更新。 暂时,工具栏不更新。

class ToolBar : View("Tool bar") { private val controller: MainController by inject() override val root = vbox { tilepane { for (tool in controller.subController.tools) { button(tool.name, group).action { controller.subController.changeTool(tool) // changes selected tool } } } this += controller.subController.selectedTool.options } } 

额外的信息:subController.tools是一个ArrayList和subController.selectedTool是一个工具。

现在我的问题是,什么是在TornadoFX做这个建议的方式?

你有几个选择。 Parent支持一个名为bindChildren的函数,它接受一个可观察的项目列表和一个将每个项目转换为一个Node的函数。 您可以使用它在工具栏中创建按钮:

 tilepane { bindChildren(controller.subController.tools) { tool -> Button(tool.name) ... } } 

如果您需要更多控制,您也可以手动执行此操作:

tilepane {controller.subController.tools.onChange {children.clear()//在这里创建新的按钮,就像你的例子}}

但是,而不是注入控制器来访问subController到工具,你应该有一个ToolsModel注入到当前范围。 工具模型可以有一个工具列表和选定的工具,可以注入到所有需要它的视图和控制器中。 你说selectedTool是一个工具,但是你没有显示一个工具是什么,但是从你的代码看,它看起来像Tool.options是一个Node子类(?)。

您可以使用相同的技术添加/删除tool.options元素,甚至可以将其包装在堆栈窗格或其他layoutcontainer中,以便使用相同的技术识别要移除的工具(或者简单地移除堆叠面板的所有子项) 。