【问题标题】:Binding TextField to the ListView item将 TextField 绑定到 ListView 项
【发布时间】:2018-10-09 20:47:12
【问题描述】:

我最近开始使用 TornadoFX 和 Kotlin,但我被绑定的东西困住了。

我可以添加和删除新项目。 contributors list 获取新项目,但我无法编辑其项目的内容。如果我不使用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)
}

【问题讨论】:

    标签: javafx kotlin tornadofx


    【解决方案1】:

    不需要使用参数将视图模型传递给另一个UI组件,只需将其注入ContributorFragment

    val viewModel: MyViewModel by inject()
    

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

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

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

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

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

    【讨论】:

    • 感谢@Edvin Syse 的回复。我通过指定类来更新我的答案以更好地理解结构。我正在使用一种模型和一种视图模型。你发的视频很棒。但它展示了如何将对象及其属性绑定到文本字段。列表及其动态添加的项目怎么样。我可以将它们绑定到文本字段吗?
    • 是的,您可以/应该在这种情况下使用 ListCellFragment,请参阅edvin.gitbooks.io/tornadofx-guide/content/part2/…
    • 感谢@Edvin Syse,ListCellFragment 完成了它的工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-09
    • 1970-01-01
    • 2013-12-23
    相关资源
    最近更新 更多