TornadoFx ItemViewModel项目为空

我有课

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

机智的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对象? 不是视图模型。 谢谢

您需要将item设置到ViewModel 。 为了给它一个新的实例,做model.item = Patient(...) 。 尽管你不一定需要这样做。

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

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

请注意,您需要一个无参数构造函数才能在注入时使用您的视图模型。

由于您的Patient类是不可变的,因此ViewModel无法自动将数据写回到其中。 为了解决这个问题, onCommitViewModel重写onCommit ,并根据当时ViewModel属性中的值为item属性指定一个新值。

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

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