TornadoFX:如何保留 `ItemViewModel` 的 属性?

TornadoFX: How to preserve `ItemViewModel`'s property?

美好的一天。 我正在尝试保留 属性 of ItemViewModel via config 助手。我能够成功保存 属性(生成 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()
                        }
                    }
                }
            }
        }
    }
}

关于为什么模型没有恢复价值的任何想法?

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

您可以参考其他组件的 config 存储,因此一种解决方案是让 View 像这样访问 ViewModel 的配置存储:

button("Do something") {
    enableWhen(model.valid)
    action {
        model.commit {
            // ...
            with(model.config) {
                set("pm" to model.preserveMe.value)
                save()
            }
        }
    }
}

但是,有一个更简单且包含更多的解决方案,只需在 FooModel 的 onCommit 回调

中处理保存
override fun onCommit() {
    with(config) {
        set("pm" to preserveMe.value)
        save()
    }
}

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

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