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

时间:2017-12-06 18:37:14

标签: kotlin tornadofx

我在Kotlin和TornadoFX库一起工作。想象一下,您有一个工具栏,显示对您当前视图有用的工具。所以我们有一个MainController,它有一个subController属性,它是工具栏旁边某个视图的控制器。因此,如果我们的subController发生更改,视图应该更新。此外,如果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中推荐的方法是什么?

1 个答案:

答案 0 :(得分:1)

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

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

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

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

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

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