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