gpt4 book ai didi

javafx - 将 TextField 绑定(bind)到 ListView 项

转载 作者:行者123 更新时间:2023-12-02 13:22:28 25 4
gpt4 key购买 nike

我最近开始使用 TornadoFX 和 Kotlin 并且我被困在绑定(bind)的东西上。

我可以添加新项目并删除它们。 contributors list 获取新项目,但我无法编辑其项目的内容。如果我不使用 bind(itemProperty())我可以编辑文本字段,但是 contributors列表不更新。如果我使用此绑定(bind),则无法编辑文本字段。

在主视图中,我像这样打开模态窗口
主视图.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()
}
}
}
}
}

贡献者片段.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()
}
}
}
}
}

主视图模型.kt
class MainViewModel: ViewModel() {
var contributorProperty = bind { model.contributorProperty }
}

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

最佳答案

无需使用参数将 View 模型传递给另一个 UI 组件,只需将其注入(inject) ContributorFragment :

val viewModel: MyViewModel by inject()

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

你在 MainViewModel 中有一些奇怪的命名这表明您将 View 模型属性绑定(bind)到另一个 View 模型中?也许我误解了,但它看起来很奇怪。

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

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

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

关于javafx - 将 TextField 绑定(bind)到 ListView 项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52700365/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com