Привязка TextField к элементу ListView - PullRequest
0 голосов
/ 08 октября 2018

Я недавно начал работать с 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 Ответ

0 голосов
/ 08 октября 2018

Нет необходимости передавать модель представления другому компоненту пользовательского интерфейса, используя параметры, просто введите ее в ContributorFragment:

val viewModel: MyViewModel by inject()

Теперь вы можете получить доступ к viewModel.contributors более естественным образом иудалите этот беспорядок из вашего кода.

У вас есть странное именование в MainViewModel, которое предполагает, что вы связываете свойство модели представления внутри другой модели представления?Может быть, я неправильно понимаю, но это выглядит странно.

Я думаю, что вы могли бы извлечь выгоду из этого скринкаста об основных / подробных операциях в TornadoFX:

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

О непроблема обновления: я бы предложил обернуть строки в объект модели с наблюдаемым свойством для строки.Без этого у них нет возможности их обновить.Помните, что строка не передается по ссылке, поэтому даже если вы измените строку в TextField, вы не будете работать с тем же экземпляром, который есть в вашем списке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...