TornadoFX Обновление ItemViewModel, если объект Backing, не отображающий свойства JavaFX, изменен

У меня есть следующий код

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()] } } 

После нажатия кнопки model.itemProperty изменяется, но model.status нет. Вызов model.rollback() делает трюк, но я полагаю, что это ItemViewModel обновить ItemViewModel после изменения свойства. Есть ли способ TornadoFX обновить UserModel (и соответствующий View в результате) без назначения нового объекта User для model.item ?

Когда ваш вспомогательный объект не является наблюдаемым, вызов rollback() – это именно то, что нужно сделать. Семантика идеально подходит для вашего использования, так как откат гарантирует, что ваш ViewModel соответствует значениям в уже назначенном объекте поддержки.

В вашем случае вы знаете, что изменилось, поэтому, если вы хотите сохранить существующие значения в том виде, в каком они есть, и только обновить статус, который вы, возможно, также прагматичны:

 model.status.value = model.item.status 

Лично я всегда использую наблюдаемые значения, когда могу, они не добавляют много шаблонов с новым синтаксисом, и они позволяют вам писать свой код гораздо более декларативным образом. Для полноты, так вы объявляете status как наблюдаемое свойство в User :

 val statusProperty = SimpleBooleanProperty() var status by statusProperty 
Intereting Posts
Очистить шаги для импорта собственной библиотеки C в Котлин с помощью CLion Moshi + Kotlin + SealedClass spring.config.location не работает на Spring Boot 2.0.0 M6 Использование подчеркивания («_») сразу после переменной в строковых шаблонах в Котлине Обменный код между модульными испытаниями и контрольно-измерительными тестами при использовании котлина В Android Java / Kotlin реализация интерфейса дает ему прямой доступ к локальным переменным класса вложенности Неопределенная ссылка для Holdr в Котлине Kotlin: как передать последовательность (сопрограммы) как Iterable <T> Расширения в Котлине Могу ли я запустить Android Studio 3.0 без Kotlin? Как использовать анонимные классы Kotlin в качестве аргументов для собственных функций JavaScript? Как создать асинхронный вызов с помощью дооснащения и наблюдения в Котлине? Мне нужно знать, почему? и если я изменю эту строку на "println (name + two)" ошибка решена? как использовать @jvmoverloads с интерфейсом в Kotlin libgdx AssetManager preload ttf шрифт не работает