代码之家  ›  专栏  ›  技术社区  ›  Jozef

ItemViewModel项为空

  •  1
  • Jozef  · 技术社区  · 8 年前

    我有课

      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 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

    1 回复  |  直到 6 年前
        1
  •  2
  •   Edvin Syse    8 年前

    你需要设置一个 item 进入 ViewModel . 要给它一个新实例,请执行以下操作: model.item = Patient(...) . 不过,你不一定需要提前做这些。

    患者实例也可以传递给 视图模型 超级构造函数自动设置 项目 财产:

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

    请注意,您需要一个无参数构造函数才能将viewmodel用于注入。

    自从你 Patient 类是不可变的,ViewModel无法自动将数据写入其中。要克服此问题,请覆盖 onCommit 并为 项目 属性,基于当时ViewModel属性中的值。

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

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