将 TextField 绑定到 ListView 项
Binding TextField to the ListView item
我最近开始使用 TornadoFX 和 Kotlin,但我被绑定问题困住了。
我可以添加和删除新项目。 contributors
列表获取新项目,但我无法编辑其项目的内容。如果我不使用 bind(itemProperty())
我可以编辑文本字段,但 contributors
列表不会更新。如果我使用此绑定,则无法编辑文本字段。
在主视图中,我这样打开模态 window
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)
}
无需使用参数将视图模型传递给另一个 UI 组件,只需将其注入 ContributorFragment
:
val viewModel: MyViewModel by inject()
现在您可以以更自然的方式访问 viewModel.contributors
并消除代码中的混乱。
您在 MainViewModel
中有一些奇怪的命名,这表明您在另一个视图模型中绑定了一个视图模型 属性?可能是我理解错了,但看起来很奇怪。
我认为您可以从有关 TornadoFX 中 master/detail 操作的截屏视频中受益:
https://www.youtube.com/watch?v=1G1OYBRDSBs
关于非更新问题:我建议将字符串包装在模型对象中,并为字符串设置一个可观察的 属性。没有它,他们就无法更新。请记住,字符串不是通过引用传递的,因此即使您更改了 TextField 中的字符串,您也不会在列表中的同一个实例上操作。
我最近开始使用 TornadoFX 和 Kotlin,但我被绑定问题困住了。
我可以添加和删除新项目。 contributors
列表获取新项目,但我无法编辑其项目的内容。如果我不使用 bind(itemProperty())
我可以编辑文本字段,但 contributors
列表不会更新。如果我使用此绑定,则无法编辑文本字段。
在主视图中,我这样打开模态 window
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)
}
无需使用参数将视图模型传递给另一个 UI 组件,只需将其注入 ContributorFragment
:
val viewModel: MyViewModel by inject()
现在您可以以更自然的方式访问 viewModel.contributors
并消除代码中的混乱。
您在 MainViewModel
中有一些奇怪的命名,这表明您在另一个视图模型中绑定了一个视图模型 属性?可能是我理解错了,但看起来很奇怪。
我认为您可以从有关 TornadoFX 中 master/detail 操作的截屏视频中受益:
https://www.youtube.com/watch?v=1G1OYBRDSBs
关于非更新问题:我建议将字符串包装在模型对象中,并为字符串设置一个可观察的 属性。没有它,他们就无法更新。请记住,字符串不是通过引用传递的,因此即使您更改了 TextField 中的字符串,您也不会在列表中的同一个实例上操作。