Привязка TextField к элементу ListView
Недавно я начал работать с 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 ответ
Нет необходимости передавать модель представления другому компоненту пользовательского интерфейса, используя параметры, просто вставьте ее в ContributorFragment
:
val viewModel: MyViewModel by inject()
Теперь вы можете получить доступ viewModel.contributors
более естественным образом и удалите этот беспорядок из вашего кода.
У вас есть странные названия в MainViewModel
что говорит о том, что вы связываете свойство модели представления внутри другой модели представления? Может быть, я неправильно понимаю, но это выглядит странно.
Я думаю, что вы могли бы извлечь выгоду из этого скринкаста об основных / подробных операциях в TornadoFX:
https://www.youtube.com/watch?v=1G1OYBRDSBs
О проблеме без обновления: я бы предложил обернуть строки в объект модели с наблюдаемым свойством для строки. Без этого у них нет возможности их обновить. Помните, что String не передается по ссылке, поэтому даже если вы измените строку в TextField, вы не будете работать с тем же экземпляром, который есть в вашем списке.