Las properties vinculadas no funcionan

Estoy usando TornadoFX 1.7.5 y parece que no puedo conseguir que las properties enlazadas funcionen. Tengo los siguientes ItemViewModels

class DynamicMenuViewModel : ItemViewModel<DynamicMenu>(DynamicMenu()) { val title = bind { item?.title?.toProperty() } val isBold = bind { item?.isBold?.toProperty() } val routes = bind { item?.routes?.toProperty() } } data class DynamicMenu(var title: String = "", var isBold: Boolean = false, var routes: MutableList<MenuRouteViewModel> = mutableListOf()) class MenuRouteViewModel : ItemViewModel<MenuRoute>(MenuRoute()) { val url = bind { item?.url?.toProperty() } val title = bind { item?.title?.toProperty() } val isBold = bind { item?.isBold?.toProperty() } val showNew = bind { item?.showNew?.toProperty() } } data class MenuRoute(var url: String = "", var title: String = "", var showNew: Boolean = false, var isBold: Boolean = false) 

Que están obligados así:

 //routesController.dynamicMenu is an instance of DynamicMenuViewModel() textfield(property = routesController.dynamicMenu.title) { prefWidth = formWidth * .5 gridpaneConstraints { columnRowIndex(0, 1) marginLeft = 10.0 columnSpan = 2 marginBottom = 20.0 } } checkbox(property = routesController.dynamicMenu.isBold){ gridpaneConstraints { columnRowIndex(2, 1) marginLeft = 15.0 marginBottom = 20.0 } } 

Luego, las siguientes funciones confirman los models y los imprime en la pantalla cuando hago clic en un button:

  fun onClick(){ commitModel() println(dynamicMenu.item.toString()) dynamicMenu.item.routes.forEach { println(it.item.toString()) } } fun commitModel(){ dynamicMenu.item.routes.forEach { it.commit() } dynamicMenu.commit() } 

El problema es que cuando ejecuto el progtwig y edito los campos de text y las casillas de verificación, hago clic en el button que se ejecuta en onClick() , el elemento de respaldo no parece estar actualizándose. Por lo tanto, ninguno de los valores actualizados se imprimen en la console.

¿Qué estoy haciendo mal aquí?

El ViewModel puede, como probablemente sepa, solo enlazarse bidireccionalmente contra las Propiedades de JavaFX. Sus objects de dominio no contienen properties JavaFX, por lo que debe convertirlos. Sin embargo, la function toProperty() que está utilizando solo opera en un valor y lo convierte en una Propiedad. Esta propiedad no tiene forma de conocer su propietario de campo y, por lo tanto, no puede volver a escribir en el object de dominio.

Afortunadamente, puede usar la function observable para hacer que las properties de sus objects de dominio también se puedan escribir:

val url = bind { item?.observable(MenuRoute::url) }

Como la function observable opera en una instancia específica de un object MenuRoute , ahora tiene suficiente información para volver a escribir en esa instancia cuando se commit() el model.

Si consideras cambiar las properties de los objects de tu dominio para que sean observables, puedes escribir:

val url = bind(MenuRoute::url)

Puede usar la inspección de plugins IDEA de TornadoFX "Convertir todas las properties a Propiedades de TornadoFX" para volver a trabajar automáticamente sus properties. Esto transformaría su object MenuRoute en:

 class MenuRoute { val isBoldProperty = SimpleBooleanProperty(false) var isBold by isBoldProperty val showNewProperty = SimpleBooleanProperty(false) var showNew by showNewProperty val urlProperty = SimpleStringProperty("") var url by urlProperty val titleProperty = SimpleStringProperty("") var title by titleProperty } 

(Debe eliminar manualmente el modificador de data en su class. Tenga en count también que la versión actual del complemento tiene un error en la function de conversión que dejaría los parameters anteriores; en breve se lanzará una nueva versión).

Si no quieres hacer eso por varias razones, solo pude soportar esa buena syntax incluso para variables mutables como las que tienes, así que desde TornadoFX 1.7.6 puedes usar esta syntax en tus declaraciones bindings incluso si no lo haces Quiero cambiar tus classs de datos:

val url = bind(MenuRoute::url)

  • Crea una vista arbitraria
  • ¿Por qué mi escena es nula?
  • Cómo ejecutar tornado fx hello world con java 7
  • ¿Cómo cancelar la suscripción a events en TornadoFX?
  • CellCache se representa inesperadamente en TableView con tornadoFX
  • java.lang.ClassNotFoundException: no encontró la class "com.my.app.example.Main" en la ruta: DexPathList
  • Cómo implementar TornadoFX WebEngine Callback en Kotlin
  • Tornadofx - controlando el object de la fila de la vista de tabla mientras construye
  • TornadoFX envuelve las classs de dominio en ItemViewModel
  • tornadofx EventBus expande la fila de la tabla usando el object tableview
  • ¿Hay alguna manera de vincular una propiedad a appConfig en tornadofx?