Enlazando una vista a una propiedad de controller cambiante

Estoy trabajando en Kotlin con la biblioteca TornadoFX. Imagine que tiene una barra de herramientas que muestra la herramienta que es útil para la vista actual que tiene. Entonces tenemos un MainController que tiene una propiedad subController que es el controller de alguna vista al lado de la barra de herramientas. Entonces, si nuestro subController cambia, la vista debería actualizarse. Además, si alguna propiedad (p. Ej. Herramienta seleccionada, herramientas) del subController cambia, la barra de herramientas debería actualizarse en consecuencia. Momentáneamente, la barra de herramientas no se actualiza.

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 } } 

Información adicional: subController.tools es una ArrayList y subController.selectedTool es una herramienta.

Ahora mi pregunta es, ¿cuál es la forma recomendada de hacer esto en TornadoFX?

Tienes varias opciones. Un Parent admite una function llamada bindChildren que acepta una list observable de elementos y una function para convertir cada uno de estos elementos en un nodo. Puede usar esto para crear sus botones en la barra de herramientas:

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

También puede hacerlo manualmente si necesita más control:

tilepane {controller.subController.tools.onChange {children.clear () // crea nuevos botones aquí, como en tu ejemplo}}

Sin embargo, en lugar de inyectar el controller para acceder a subController para acceder a las herramientas, debe tener un ToolsModel que se inyecta en el scope actual. El model de herramientas podría tener una list de herramientas y las herramientas seleccionadas y se puede inyectar en todas las vistas y controlleres que lo necesiten. Usted dice que selectedTool es una Herramienta, pero no muestra qué es una Herramienta, pero a juzgar por su código, parece que Tool.options es una subclass Node (?).

Puede agregar / eliminar el elemento tool.options usando la misma técnica, o incluso envolverlo en un panel de distribución u otro contenedor de layout para poder identificar la herramienta para eliminar (o simplemente eliminar todos los elementos secundarios del stackpane) al cambiar usando la misma técnica .

  • Forma de configurar las properties de PrimaryStage o Scene en TornadoFX
  • TableView de Tornadofx usando comboBox y agregando FXEvent en los botones
  • Tornadofx - controlando el object de la fila de la vista de tabla mientras construye
  • Desplazamiento suave en JavaFX TableView
  • preguntas sobre DI, ViewModel, etc.
  • Tornadofx tableview sincroniza dos tablas
  • Dibujando líneas desde ViewModel TornadoFX
  • TornadoFX cómo agregar validation al editar TableView
  • Cómo implementar TornadoFX WebEngine Callback en Kotlin
  • tornadoFX togglebutton no tiene propiedad de text
  • Cómo configurar una aplicación Gluon con Kotlin y Tornado FX