tornadofx ViewModel和ItemViewModel中的kotlin var属性

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

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

这似乎是行不通的。 如何解决这个问题。 IDE显示红色下划线“绑定”,但如果我写

  val name = bind(RoomType::name) 

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

您需要使ItemViewModel知道该人员实例,但也可以稍后对其对基础项目的更改做出反应。 您需要将您传递的人员分配给ItemViewModel的item属性。 这可以通过在构造函数中传递来完成:

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

请注意,如果您添加此构造函数,则只能在注入时使用该视图模型(如果将其手动插入到范围中),因为它不能由框架实例化。 因此,您应该添加一个noargs构造函数,或者只是在创建它之后省略person参数并分配给项目。

如果您更新底层人员的值,则只有在值可观察的情况下才会在视图模型中显示。 如果不是,则必须调用rollback()来更新人员的更改。 您只能为特定字段调用回滚。

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

在你的类声明中,使用var person: Person

person需要成为类的成员,而不仅仅是构造函数的参数。 你可以通过在构造函数参数中声明varval来完成这个工作,或者你可以用一个常规的方法将一个成员字段添加到这个类中,然后赋值给它(可能使用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) } }