将TextField绑定到ListView项目

时间:2018-10-08 10:32:42

标签: javafx kotlin tornadofx

我最近开始与TornadoFX和Kotlin一起工作,我陷入了绑定问题。

我可以添加和删除新项目。 contributors列表中有新项目,但是我无法编辑其内容。如果我不使用bind(itemProperty()),则可以编辑文本字段,但是contributors列表不会更新。如果使用此绑定,则无法编辑文本字段。

在主视图中,我这样打开模式窗口

MainView.kt

class MainView : View("Main") {
    override val root = VBox()
    private val viewModel by inject<MainViewModel>()

    init {
        with(root) {
            button("Edit") {
                action {                                             
                    find<ContributorFragment>(                                                
                        mapOf(ContributorFragment::contributors to 
                            viewModel.contributorProperty)).openModal()
                }
            }
        }
    }
}

ContributorFragment.kt

class ContributorFragment: Fragment() {
    val contributors: ObservableList<String>? by param()

    fieldset {
        field {
            listview(contributors) {
                cellFormat {
                    graphic = hbox {
                        textfield {
                        bind(itemProperty())
                }

                button("Delete") {
                    action {
                        contributors?.remove(it)
                    }
                }
            }
        }
     }

     fieldset {
         field {
             button("Add") {
                 action {
                     contributors?.add("")

                 }
             }
             button("Save") {
                 action {
                     close()
                 }
             }
          }
      }
}

MainViewModel.kt

class MainViewModel: ViewModel() {
    var contributorProperty = bind { model.contributorProperty }
}

MainModel.kt

class MainModel {
    private var contributor: ObservableList<String> by property()
    val contributorProperty = getProperty(MainModel::contributor)
}

1 个答案:

答案 0 :(得分:2)

无需使用参数将视图模型传递给另一个UI组件,只需将其注入到ContributorFragment中即可:

val viewModel: MyViewModel by inject()

现在,您可以以更自然的方式访问viewModel.contributors,并从代码中消除该混乱情况。

您在MainViewModel中有一些奇怪的命名,这表明您要将视图模型属性绑定到另一个视图模型中吗?也许我误会了,但看起来很奇怪。

我认为您可以从以下有关TornadoFX中的主/详细操作的截屏视频中受益:

https://www.youtube.com/watch?v=1G1OYBRDSBs

关于非更新问题:我建议将字符串包装在带有可观察属性的模型对象中。没有它,他们将无法更新。请记住,字符串不是通过引用传递的,因此即使您在TextField中更改字符串,也不会在列表中使用的同一实例上进行操作。