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无法自动将数据写回到其中。 为了解决这个问题, onCommit
在ViewModel
重写onCommit
,并根据当时ViewModel属性中的值为item
属性指定一个新值。
override fun onCommit() { item = Patient(birthNumber.value, ...) }
JavaFX可观察属性旨在与可变数据结构一起使用,因此您必须跳过一些额外的箍环以使用不可变的值。