TornadoFX ItemViewModel更新如果支持对象,不公开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后更改后的属性。 有没有TornadoFX的方式来更新UserModel (和相应的视图结果),而不是分配一个新的User对象到model.item

当你的支持对象不可观察时,调用rollback()是正确的。 语义与您的使用情况非常吻合,因为回滚确保您的ViewModel与已分配的后台对象中的值相匹配。

在你的情况下,你知道发生了什么变化,所以如果你想保持现有的值,只更新状态,你可能会务实:

 model.status.value = model.item.status 

就我个人而言,我总是使用可观察的值,他们不会用新的语法添加许多样板文件,并且它们使您能够以更具说明性的方式编写代码。 为了完整起见,这是你如何在User声明status为可观察属性:

 val statusProperty = SimpleBooleanProperty() var status by statusProperty