Привязка 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, вы не будете работать с тем же экземпляром, который есть в вашем списке.

Другие вопросы по тегам