TornadoFX ItemViewModel se actualiza si se cambia el object de respaldo que no expone las properties de JavaFX

Tengo un código siguiente

class MainView : View("Example") { val model: UserModel = UserModel() init { model.item = User(status = true) } override val root = vbox { useMaxWidth = true label(model.status) button("Get new status") { action { model.item.updateStatus() println("Status in model: ${model.status.value}") println("Status in backing object: ${model.item.status}") } } } } class User(var status: Boolean, val api: Api = Api()) { fun updateStatus() { status = api.getStatus() } } class UserModel : ItemViewModel<User>() { val status = bind(User::status) } class Api { fun getStatus(): Boolean { val list = listOf(true, false) return list[(Math.random() * list.size).toInt()] } } 

Después de hacer clic en el button, la model.itemProperty cambia pero el model.status no. Llamar a model.rollback() funciona, pero supongo que no es la forma ItemViewModel actualizar ItemViewModel después de que se ItemViewModel propiedad de respaldo. ¿Hay alguna manera de UserModel actualizar el UserModel (y la vista correspondiente como resultado) sin asignar un nuevo object de User al model.item ?

Cuando su object de respaldo no es observable, llamar a rollback() es exactamente lo que debe hacer. La semántica se ajusta perfectamente a su caso de uso, ya que la reversión asegura que su ViewModel coincida con los valores del object de respaldo ya asignado.

En su caso, usted sabe qué ha cambiado, así que si desea mantener los valores existentes tal como están y solo actualizar el estado, podría ser muy pragmático al respecto:

 model.status.value = model.item.status 

Personalmente, siempre utilizo valores observables cuando puedo, no agregan mucho text repetitivo con la nueva syntax, y te permiten escribir tu código de una manera mucho más declarativa. Para completar, así es como declarará el status como una propiedad observable en User :

 val statusProperty = SimpleBooleanProperty() var status by statusProperty 
  • Crea una vista arbitraria
  • Tornadofx Javafx - Cómo volver a cargar una vista / componente
  • Enlazando una vista a una propiedad de controller cambiante
  • ¿Cuál es la mejor práctica para crear un componente de IU personalizado en tornadofx?
  • TornadoFX: permite copyr un elemento de una vista de list al portapapeles
  • Forma de configurar las properties de PrimaryStage o Scene en TornadoFX
  • ¿Cómo puedo refactorizar una vista para permitir el filtrado de elementos vinculados a un observable ArrayList dentro de una aplicación tornadofx?
  • TornadoFX - Creación de un layout MVP
  • ¿Cómo cancelar la suscripción a events en TornadoFX?
  • TornadoFX cómo agregar validation al editar TableView
  • El elemento TornadoFx ItemViewModel es nulo