Tornadofx-使用自定义验证器强制装饰

时间:2018-08-24 17:17:31

标签: tornadofx

我想强迫Tornadofx装饰一个验证,该验证是在加载片段后立即用model.addValidator()方法添加的。我使用model.validate(decorateErrors = true)

这似乎适用于已添加validator扩展名的验证器,但不适用于使用model.addValidator()扩展名的验证器

我在下面提供了示例代码。在该示例中,文本字段上的验证器按预期方式工作,但按钮上的验证器却无法正常工作。

Resulting UI

在这里,单击两次按钮后:

Resulting UI after clicks

从片段中可以看出,测试按钮上没有红色三角形。但是,如果单击测试按钮,则验证器将开始正常工作。

这是示例代码:

class ExampleDomain {

    private val testBooleanProperty = SimpleBooleanProperty(false)
    fun testBooleanProperty() = testBooleanProperty
    var testBoolean by testBooleanProperty

    private val testStringProperty = SimpleStringProperty("")
    fun testStringProperty() = testStringProperty
    var testString by testStringProperty

}

class ExampleModel : ItemViewModel<ExampleDomain>(ExampleDomain()) {
    val testBooleanProperty = bind(ExampleDomain::testBooleanProperty)
    val testStringProperty = bind(ExampleDomain::testStringProperty)
}

class ExampleFragment : Fragment() {

    val model by inject<ExampleModel>()

    val validatedButton = button("test") {
        action {
            model.testBooleanProperty.value = !model.testBooleanProperty.value
        }
    }

    override val root = vbox {
        padding = Insets(10.0, 10.0, 10.0, 10.0)
        spacing = 5.0

        textfield(model.testStringProperty) {
            validator {
                println(it)
                when (!model.testStringProperty.value.isNullOrEmpty()) {
                    true -> success()
                    false -> error()
                }
            }
        }
        children += validatedButton
    }

    init {

        model.addValidator(validatedButton, model.testBooleanProperty) {
            when (model.testBooleanProperty.value == true) {
                true -> success()
                else -> error()
            }
        }

        model.validate(decorateErrors = true)
    }
}

0 个答案:

没有答案