Javafx 绑定属性不工作
我使用的是TornadoFX 1.7.5,似乎无法使绑定属性正常工作。我有下面的ItemViewModelsJavafx 绑定属性不工作,javafx,kotlin,tornadofx,Javafx,Kotlin,Tornadofx,我使用的是TornadoFX 1.7.5,似乎无法使绑定属性正常工作。我有下面的ItemViewModels class DynamicMenuViewModel : ItemViewModel<DynamicMenu>(DynamicMenu()) { val title = bind { item?.title?.toProperty() } val isBold = bind { item?.isBold?.toProperty() } val routes = b
class DynamicMenuViewModel : ItemViewModel<DynamicMenu>(DynamicMenu()) {
val title = bind { item?.title?.toProperty() }
val isBold = bind { item?.isBold?.toProperty() }
val routes = bind { item?.routes?.toProperty() }
}
data class DynamicMenu(var title: String = "", var isBold: Boolean = false, var routes: MutableList<MenuRouteViewModel> = mutableListOf())
class MenuRouteViewModel : ItemViewModel<MenuRoute>(MenuRoute()) {
val url = bind { item?.url?.toProperty() }
val title = bind { item?.title?.toProperty() }
val isBold = bind { item?.isBold?.toProperty() }
val showNew = bind { item?.showNew?.toProperty() }
}
data class MenuRoute(var url: String = "", var title: String = "", var showNew: Boolean = false, var isBold: Boolean = false)
然后,当我单击按钮时,以下函数提交模型并将其打印到屏幕上:
fun onClick(){
commitModel()
println(dynamicMenu.item.toString())
dynamicMenu.item.routes.forEach {
println(it.item.toString())
}
}
fun commitModel(){
dynamicMenu.item.routes.forEach {
it.commit()
}
dynamicMenu.commit()
}
问题是,当我运行程序并编辑文本字段和复选框,然后单击运行onClick()
的按钮时,备份项似乎没有得到更新。因此,没有更新的值打印到控制台
我做错了什么?您可能知道,ViewModel只能针对JavaFX属性进行双向绑定。您的域对象不包含JavaFX属性,因此您需要转换它们。但是,您正在使用的
toProperty()
函数仅对值进行操作,并将其转换为属性。此属性无法知道其字段所有者,因此无法写回域对象
幸运的是,您可以使用observable
函数使域对象属性也可写:
val url=bind{item?.observable(MenuRoute::url)}
由于observable
函数在MenuRoute
对象的特定实例上运行,因此当您commit()
模型时,它现在有足够的信息写回该实例
如果你想改变你要观察的域对象中的属性,你可以写:
val url=bind(MenuRoute::url)
您可以使用TornadFX IDEA插件“将所有属性转换为TornadFX属性”来自动修改属性。这将把MenuRoute
对象转换为:
class MenuRoute {
val isBoldProperty = SimpleBooleanProperty(false)
var isBold by isBoldProperty
val showNewProperty = SimpleBooleanProperty(false)
var showNew by showNewProperty
val urlProperty = SimpleStringProperty("")
var url by urlProperty
val titleProperty = SimpleStringProperty("")
var title by titleProperty
}
(您必须手动删除类上的数据
修饰符。还要注意,当前版本的插件在转换函数中有一个错误,该错误将保留旧参数-新版本将很快发布)
如果出于各种原因您不想这样做,我只是能够支持这种好的语法,即使是像您这样的可变变量,所以从TornadFX 1.7.6中,您可以在绑定语句中使用这种语法,即使您不想更改数据类:
val url=bind(MenuRoute::url)
class MenuRoute {
val isBoldProperty = SimpleBooleanProperty(false)
var isBold by isBoldProperty
val showNewProperty = SimpleBooleanProperty(false)
var showNew by showNewProperty
val urlProperty = SimpleStringProperty("")
var url by urlProperty
val titleProperty = SimpleStringProperty("")
var title by titleProperty
}