TornadoFx:如何将ItemViewModel绑定到组合框和整个表单?

时间:2018-03-20 14:37:28

标签: kotlin tornadofx

我有课程UserItemViewModel

class User(name: String, type: Int, isAdmin: Boolean) {

    var name by property<String>(name)
    fun nameProperty() = getProperty(User::name)

    var type by property<Int>(type)
    fun typeProperty() = getProperty(User::type)

    var isAdmin by property<Boolean>(isAdmin)
    fun isAdminProperty() = getProperty(User::isAdmin)

}

class UserModel : ItemViewModel<User>() {
    val name = bind { item?.nameProperty() }
    val type = bind { item?.typeProperty() }
    val isAdmin = bind { item?.isAdminProperty() }
}

此外,我View FormController

class ChooseUserView : View() {

    val ctrl: ChooseUserCtrl by inject()

    override val root = form {

        fieldset("Choose user") {

            field("Name") {
                combobox<User> {
                    items = ctrl.users
                    selectionModel.select(0)
                }
            }

            field("Psw") {
                textfield {
                    whenVisible {
                        ctrl.model.isAdmin
                    }
                }
            }
        }
    }

}

class ChooseUserCtrl : Controller() {

    val view: ChooseUserView by inject()

    val users = FXCollections.observableArrayList<User>()
    val model = UserModel()

    init {
        users.add(User("disp", 1, false))
        users.add(User("admin", 2, true))
    }

}

我想将用户列表绑定到表单

  1. 在组合框中,我想看到名字,而不是这些地址 image
  2. combobox索引发生变化时,我希望根据布尔属性textfield("Psw")看到isAdmin的绑定启用。

1 个答案:

答案 0 :(得分:1)

以下是tornadofx作者的回答:

你走了:

class User() {
    constructor(name: String, type: Int, isAdmin: Boolean): this() {
        this.name = name
        this.type = type
        this.isAdmin = isAdmin
    }

    val nameProperty = SimpleStringProperty()
    var name by nameProperty

    val typeProperty = SimpleIntegerProperty()
    var type by typeProperty

    val isAdminProperty = SimpleBooleanProperty()
    var isAdmin by isAdminProperty

    val passwordProperty = SimpleStringProperty()
    var password by passwordProperty
}

class UserModel(user: User? = null) : ItemViewModel<User>(user) {
    val name = bind(User::nameProperty)
    val type = bind(User::typeProperty)
    val isAdmin = bind(User::isAdminProperty)
    val password = bind(User::passwordProperty)
}


class ChooseUserView : View() {
    val ctrl: ChooseUserCtrl by inject()
    val selectedUser = UserModel(ctrl.users.first())

    override val root = form {
        fieldset("Choose user") {
            field("Name") {
                combobox(selectedUser.itemProperty, ctrl.users) {
                    cellFormat {
                        text = it.name
                    }
                }
            }

            field("Psw") {
                visibleWhen(selectedUser.isAdmin)
                textfield(selectedUser.password)
            }
        }
    }

}

class ChooseUserCtrl : Controller() {
    val users = FXCollections.observableArrayList<User>()

    init {
        users.add(User("disp", 1, false))
        users.add(User("admin", 2, true))
    }
}