Привязать ItemViewModel к списку классов домена - PullRequest
0 голосов
/ 21 июня 2019

У меня есть книга правил, содержащая правила:

class Rulebook(val rules:MutableList<Rule>)

У меня есть ItemViewModel для него, так как он используется в пользовательском интерфейсе выбора с множественным вложением.

class RulebookModel : ItemViewModel<Rulebook> {
    val rulesProperty = bind // ... here's my problem
}

Что такоеправильная привязка, чтобы иметь возможность инициализировать табличное представление со свойством?

Наивное связывание дает неправильный тип:

val rulesProperty = bind(Rulebook::rules)

имеет тип Property<MutableList<Rule>>, который tableview () не принимает.

Из другого ответа здесь я получил Ссылка

val rulesProperty = bind(Rulebook::rules) as ListProperty<Rule>

Это дает правильный тип, поэтому мы получаем компиляцию, но во время выполнения я получаю это:

java.lang.ClassCastException: java.util.ArrayList нельзя преобразовать в javafx.collections.ObservableList

Примечание: RulebookModel действительно запускает жизнь без элемента в немеще.Я видел ArrayLists, пришедших из пустых списков фабричных вызовов.Возможно, это моя настоящая проблема?

Как правильно выполнить эту привязку?

1 Ответ

0 голосов
/ 17 июля 2019

Ваша модель должна иметь свойство SimpleListProperty для привязки к itemViewModel Вот пример кода для написания классов и табличного представления:

data class rule(val name: String, val def: String)
class RuleBookModel{
  val rulesProperty = SimpleListProperty<rule>()
  var rules by rulesProperty
}
class RuleBookViewModel: ItemViewModel<RuleBookModel>() {
  val rules = bind(ruleBook::rulesProperty)
}

class TestView : View("Test View") {
  val myRuleBook: RuleBookViewModel by inject()
  init {
      // adding a rule so the table doesn't look lonely
      myRuleBook.rules.value.add(rule("test", "fuga"))
  }
  val name = textfield()
  val definition = textfield()
  override val root = vbox{
    hbox {
       label("Name")
       add(name)
    }
    hbox {
       label("Definition")
       add(definition)
    }
    button("Add a rule").action{
        myRuleBook.rules.value.add(rule(name.text, definition.text))
    }
    tableview(myRuleBook.rules) {
        column("name", rule::name)
        column("def", rule::def)
    }
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...