在 JavaFX / TornadoFX 中处理嵌套属性

Handling nested Properties in JavaFX / TornadoFX

我想要一个 window 来显示某些 ViewModel

的信息

假设你有一个简单的人:

class Person(name: String) {
    val nameProperty = SimpleStringProperty(name)
}

并将 Person 的实例保存在 属性:

val personProperty = SimpleObjectProperty(Person("John"))

在标签中显示人名的正确解决方案是什么?

使用这个:

label(personProperty.value.nameProperty)

我更新属性的人时不会更新:

personProperty.value = Person("Joe")

(这很明显,因为只有引用发生变化,值本身没有变化)

那么有什么好的方法可以做到这一点,还是我必须手动为 personProperty 添加侦听器并更新标签指向哪个 Person

编辑: 我还发现了这个问题:,但它不包含任何我不知道的新的和有用的东西,是否有任何 TornadoFX 特定的方法来做到这一点?

监听器可以附加到 属性:

personProperty.onChange {
    it?.nameProperty.let(nameLabel.textProperty().bind)
}

这可以包装在扩展函数中以简化任务。

这正是 ItemViewModel 为您所做的。如果您想在 ItemViewModel 之外绑定自动更新的名称 属性,您可以使用 TornadoFX 功能 select:

val nameProperty = personProperty.select { it.nameProperty }