在 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 }
我想要一个 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
?
编辑:
我还发现了这个问题:
监听器可以附加到 属性:
personProperty.onChange {
it?.nameProperty.let(nameLabel.textProperty().bind)
}
这可以包装在扩展函数中以简化任务。
这正是 ItemViewModel
为您所做的。如果您想在 ItemViewModel
之外绑定自动更新的名称 属性,您可以使用 TornadoFX 功能 select
:
val nameProperty = personProperty.select { it.nameProperty }