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 .

  • Cómo inyectar ItemViewModel en tornadoFx
  • ¿Cómo llenar el ancho de la tabla disponible con columnas?
  • tornadoFX togglebutton no tiene propiedad de text
  • La compilation de Gradle no puede encontrar tornadofx en Linux
  • ¿Cómo puedo refactorizar una vista para permitir el filtrado de elementos vinculados a un observable ArrayList dentro de una aplicación tornadofx?
  • Cómo ejecutar tornado fx hello world con java 7
  • Dibujando líneas desde ViewModel TornadoFX
  • ¿Cómo puedo crear un encabezado de columna nested / dividido usando TornadoFx?
  • TornadoFX: permite copyr un elemento de una vista de list al portapapeles
  • preguntas sobre DI, ViewModel, etc.
  • TableView de Tornadofx usando comboBox y agregando FXEvent en los botones