class Person { val nameProperty = SimpleStringProperty() var name by nameProperty override fun toString() = name } class PersonModel(person: Person = Person()) : ItemViewModel(person) { val name = bind(Person::nameProperty) } class Setup : Wizard("Setup wizard", "This wizard will guide you through the setup process") { val person: PersonModel by inject() init { add() } override fun onSave() { println(person.item) } } class Step : View("Step 1") { val person: PersonModel by inject() override val root = form { fieldset(title) { field("Name") { textfield(person.name).required() } } } override fun onSave() { person.commit() } }