Kotlin TornadFX:如何保留'ItemViewModel'的属性?

Kotlin TornadFX:如何保留'ItemViewModel'的属性?,kotlin,tornadofx,Kotlin,Tornadofx,你好。 我正试图保留via helper的一个属性。我能够成功地保存属性conf目录,并生成相应的.properties文件,但是在下一次启动时,该属性不会恢复其值,只是保持为null。下面是一个示例代码来演示我的问题: import javafx.beans.property.SimpleStringProperty import tornadofx.* data class Foo(val doNotPreserveMe: String, val preserveMe: String)

你好。 我正试图保留via helper的一个属性。我能够成功地保存属性conf目录,并生成相应的.properties文件,但是在下一次启动时,该属性不会恢复其值,只是保持为null。下面是一个示例代码来演示我的问题:

import javafx.beans.property.SimpleStringProperty
import tornadofx.*

data class Foo(val doNotPreserveMe: String, val preserveMe: String)

class FooModel : ItemViewModel<Foo>() {
    val doNotPreserveMe = bind { item?.doNotPreserveMe?.toProperty() }
    val preserveMe = bind { SimpleStringProperty(item?.preserveMe, "pm", config.string("pm")) }
}

class FooApp : App(FooView::class)

class FooView : View() {
    private val model = FooModel()

    override val root = form {
        fieldset {
            field("Do not preserve me") { textfield(model.doNotPreserveMe).required() }
            field("Preserve me") { textfield(model.preserveMe).required() }
            button("Do something") {
                enableWhen(model.valid)
                action {
                    model.commit {
                        // ...
                        with(config) {
                            set("pm" to model.preserveMe.value)
                            save()
                        }
                    }
                }
            }
        }
    }
}

关于模型为什么不恢复值有什么想法吗?

每个组件都有自己的配置存储,由单独的文件支持。请确保使用相同的配置文件或应用程序全局配置文件

您可以引用其他组件的配置存储,因此一种解决方案是让视图访问ViewModel的配置存储,如下所示:

button("Do something") {
    enableWhen(model.valid)
    action {
        model.commit {
            // ...
            with(model.config) {
                set("pm" to model.preserveMe.value)
                save()
            }
        }
    }
}
然而,有一个更简单、更包含的解决方案,它只需在FooModel的onCommit回调中处理save

在这种情况下,您只需在按钮回调中调用model.commit


您还可以使用公共配置对象,甚至是全局配置对象。使用控制器的配置存储或全局存储。要使用全局配置对象,只需在模型和视图中都参考app.config。

您能发布完整的示例应用程序吗?我怀疑您在读写时正在访问不同的配置对象。@EdvinSyse,我已经编辑了我的OP,以包含一个示例代码来演示该问题onCommit成员函数是一个极好的解决方案。IMHO,这个模式验证+配置在tornadoFX指南中值得一提。太棒了!对《导游》进行一次小小的公关活动将不胜感激,我自己这些天时间有点紧,你看:
override fun onCommit() {
    with(config) {
        set("pm" to preserveMe.value)
        save()
    }
}