tornadofx ViewModel和ItemViewModel中的kotlin var属性

时间:2017-10-28 09:22:06

标签: tornadofx

根据文档,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字段更新值不会更新模型值。 请帮忙

2 个答案:

答案 0 :(得分:1)

在您的班级声明中,使用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) }
}

答案 1 :(得分:0)

您需要让ItemViewModel知道person实例,同时让它对稍后对基础项的更改做出反应。您需要将传入的人员分配到ItemViewModel的SELECT *属性。这可以通过在构造函数中传递来完成:

item

请注意,如果添加此构造函数,则只能将该viewmodel与注入一起使用,如果将其手动推入范围,因为它无法由框架实例化。因此,您应该添加一个noargs构造函数,或者只是省略person参数并在创建后指定给item。

如果更新基础人员中的值,则只有在值可观察时才会在视图模型中显示该值。如果没有,则必须致电class PersonVarViewModel(person: Person) : ItemViewModel<Person>(person) { val name = bind(Person::name) } 更新此人的更改。您只能为特定字段调用回滚。

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