在JavaFX / TornadoFX中处理嵌套属性

时间:2019-04-21 14:55:54

标签: kotlin tornadofx

我想有一个窗口,其中显示有关某些ViewModel

的信息

假设您有一个简单的Person:

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

并在属性中保存了Person的实例:

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

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

使用此:

label(personProperty.value.nameProperty)

当我更新酒店的人员时,不会更新:

personProperty.value = Person("Joe")

(这很明显,因为仅引用会更改,而值本身不会更改)

那么有什么好办法吗?还是我必须手动为personProperty添加侦听器并更新标签指向的Person

编辑: 我也发现了这个问题:JavaFX binding and property change,但是它不包含我不知道的任何新的有用的东西,是否有任何特定于TornadoFX的方式?

2 个答案:

答案 0 :(得分:3)

ItemViewModel正是为您执行的操作。如果要为ItemViewModel之外的自动更新的name属性建立绑定,可以使用TornadoFX功能select

val nameProperty = personProperty.select { it.nameProperty }

答案 1 :(得分:0)

可以很容易地将侦听器附加到属性:

personProperty.onChange {
    if (it != null) {
        nameLabel.textProperty().bind(it.nameProperty)
    }
}

肯定可以将其包装在某些扩展功能中以简化任务。