如果更改了不公开JavaFX属性的后备对象,则更新TornadoFX ItemViewModel

时间:2017-07-21 22:40:50

标签: kotlin tornadofx

我有以下代码

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(以及相应的View作为结果)而无需向User分配新model.item对象的方法?

1 个答案:

答案 0 :(得分:1)

当您的支持对象无法观察时,调用rollback()是正确的做法。语义完全适合您的用例,因为回滚可确保您的ViewModel与已分配的后备对象中的值匹配。

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

model.status.value = model.item.status

就个人而言,我总是尽可能使用可观察的值,它们不会添加太多带有新语法的样板,并且它们使您能够以更加声明的方式编写代码。为了完整起见,您可以在status中将User声明为可观察的属性:

val statusProperty = SimpleBooleanProperty()
var status by statusProperty