Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javafx 绑定属性不工作_Javafx_Kotlin_Tornadofx - Fatal编程技术网

Javafx 绑定属性不工作

Javafx 绑定属性不工作,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

我使用的是TornadoFX 1.7.5,似乎无法使绑定属性正常工作。我有下面的ItemViewModels

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
}