tornadofx ViewModel 和 ItemViewModel 中的 kotlin var 属性

kotlin var property in tornadofx ViewModel and ItemViewModel

根据文档,kotlin var 属性可以在 ViewModel 中绑定为

    // Kotlin var property
class PersonVarViewModel(person: Person) : ViewModel() {
    val name = bind { person.observable(Person::name) }
}

好像不行。 如何解决这个问题。 IDE 在下方显示红色下划线 "bind" 但如果我写

   val name = bind(RoomType::name)

没有显示错误。但是使用 UI 字段更新值不会更新模型值。 请帮忙

在您的 class 声明中,使用 var person: Person

person 需要是 class 的成员,而不仅仅是构造函数的参数。您可以通过在构造函数参数中声明它 varval 来完成此操作,或者您可以将成员字段添加到 class 常规方式并分配它(可能使用 by property, 但不确定这是不是你想要的)

class PersonVarViewModel(var person: Person) : ViewModel() {
    val name = bind { person.observable(Person::name) }
}

对于ItemViewModel ...

class PersonVarViewModel(var person: Person) : ItemViewModel<Person>() {
    val name = bind { person.observable(Person::name) }
}

您需要让 ItemViewModel 知道 person 实例,但也让它稍后对基础项目的更改做出反应。你需要把你传入的人赋给ItemViewModel的item属性。这可以通过在构造函数中传递它来完成:

class PersonVarViewModel(person: Person) : ItemViewModel<Person>(person) {
    val name = bind(Person::name)
}

请注意,如果您添加此构造函数,则只有在手动将其推送到范围内时才能使用带有注入的视图模型,因为框架无法对其进行实例化。因此,您也应该添加一个 noargs 构造函数,或者简单地省略 person 参数并在创建后分配给 item。

如果您更新底层 person 中的值,只有当该值是可观察的时,它才会在视图模型中可见。如果没有,您必须调用 rollback() 来更新此人的更改。只能针对特定字段调用回滚。

如果可能,请在您的域模型对象中使用可观察属性以避免此类问题。