TornadoFx ItemViewModel项为null

时间:2017-11-04 16:50:36

标签: kotlin tornadofx

我有课

  data class Patient(
  val  birthNumber: String ,
  val  firstName: String ,
  val  lastName: String ,
  val  birthDate: LocalDate ,
  val  healthInsurance: InsuranceCompany ,
  val  hospitalizations : List<Hospitalization> = emptyList()
)

wit itemViewmodel class

class PatientModel : ItemViewModel<Patient>() {
    val birthNumber = bind(Patient::birthNumber)
    val firstName = bind(Patient::firstName)
    val lastName = bind(Patient::lastName)
    val birthDate = bind(Patient::birthDate)
    val healthInsurance = bind(Patient::healthInsurance)
    val hospitalizations = bind(Patient::hospitalizations)
}

我试图在我的视图中将数据从textfields / combox绑定到我的PatientModel对象,就像这样

 var model = PatientModel()
    val controller: AddPatientController by inject()
    override val root = VBox()

    init {
        title = "Pridat pacienta"

        with(root) {

            goHome()
            form {
                fieldset("Personal Information") {
                    field("First name") {
                        textfield().bind(model.firstName)
                    }

                    field("Last Name") {
                        textfield().bind(model.lastName)
                    }

                    field("birthNumber") {
                        textfield().bind(model.birthNumber)
                    }

                    field("InsuranceCompany") {
                        combobox<InsuranceCompany> {
                            items = controller.insuranceComp
                        }.bind(model.healthInsurance)
                    }
                    field("birthDate") {
                        datepicker().bind(model.birthDate)
                    }

但最后我打电话给model.item时,它是空的。

我需要做什么才能获得data class Patient对象?不是viewmodel之一。谢谢

1 个答案:

答案 0 :(得分:1)

您需要将item设置为ViewModel。要为其提供新实例,请执行model.item = Patient(...)。你不一定需要事先做到这一点。

也可以将患者实例传递给ViewModel超级构造函数,以自动设置item属性:

class PatientModel(patient: Patient) : ItemViewModel<Patient>(patient)

请注意,您需要一个no args构造函数才能使用带注入的viewmodel。

由于您的Patient类是不可变的,因此ViewModel无法自动将数据写回其中。要解决此问题,请覆盖onCommit中的ViewModel,并根据当时ViewModel属性中的值为item属性分配新值。

override fun onCommit() {
    item = Patient(birthNumber.value, ...)
}

JavaFX可观察属性旨在与可变数据结构一起使用,因此您必须跳过几个额外的箍以将它们与不可变值一起使用。