将ItemViewModel绑定到域类列表

时间:2019-06-21 03:16:16

标签: tornadofx

我有一本包含规则的规则手册:

class Rulebook(val rules:MutableList<Rule>)

我有一个ItemViewModel,因为它用于多重嵌套选择UI。

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

能够使用该属性初始化表格视图的正确绑定是什么?

天真绑定会产生错误的类型:

val rulesProperty = bind(Rulebook::rules)

具有类型Property<MutableList<Rule>>,而tableview()则不需要。

从另一个答案中,我得到了Link

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

这会产生正确的类型,因此我们进行了编译,但是在运行时我得到了:

  

java.lang.ClassCastException:无法将java.util.ArrayList强制转换为javafx.collections.ObservableList

注意:RulebookModel确实可以在没有任何物品的情况下开始生活。我以前见过ArrayLists来自空列表工厂调用。那可能是我的实际问题吗?

执行此绑定的正确方法是什么?

1 个答案:

答案 0 :(得分:0)

您的模型需要具有一个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)
    }
  }
}