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