Kotlin 如何在项目属性更改时更新ItemFragment

Kotlin 如何在项目属性更改时更新ItemFragment,kotlin,javafx,tornadofx,Kotlin,Javafx,Tornadofx,我对ItemViewModel与其基础项之间的关系感到非常困惑。我试图在屏幕上显示一个徽章,然后如果该徽章在另一个线程上“实现”,则该徽章应在屏幕上更新 现在,徽章代码如下所示: class Badge { val achievedProperty = SimpleBooleanProperty(this, "achieved", false) var achieved by achievedProperty } class BadgeModel: ItemView

我对
ItemViewModel
与其基础项之间的关系感到非常困惑。我试图在屏幕上显示一个徽章,然后如果该徽章在另一个线程上“实现”,则该徽章应在屏幕上更新

现在,徽章代码如下所示:

class Badge {
  val achievedProperty = SimpleBooleanProperty(this, "achieved", false)
  var achieved by achievedProperty
}

class BadgeModel: ItemViewModel<Badge>() {
  val achieved = bind(Badge::achievedProperty)
}
这在开始时可以正常工作,但如果我随后设置
badge.acquired=true
(在我的控制器中),屏幕上的徽章颜色不会改变


我显然遗漏了一些关于对象和模型之间关系的东西,但是我在从文档中找出它时遇到了很多麻烦。有人能帮我让我的片段按我所希望的方式工作吗?

你的问题并不特定于模型或几乎任何与TornadFX相关的东西。您的书写方式仅在创建时检查颜色。您需要使用属性或绑定来侦听属性更改:

class Test : Fragment() {
    val modelAchieved = SimpleBooleanProperty(true) // pretend this is model.achieved
    val achievedColor = modelAchieved.objectBinding { isAchieved ->
        if (isAchieved == true) Color.RED
        else Color.GREEN
    }

    override val root = vbox {
        togglebutton("Toggle") {
            selectedProperty().bindBidirectional(modelAchieved)
        }
        rectangle(width = 50, height = 50) {
            stroke = Color.BLACK
            fillProperty().bind(achievedColor)
        }
    }
}

我还将双向绑定viewmodel和fragment的项属性,以便它们保持同步。或者只使用一个常规片段,并单独引用模型的item属性。

您的问题并不特定于模型或几乎任何与fx相关的东西。您的书写方式仅在创建时检查颜色。您需要使用属性或绑定来侦听属性更改:

class Test : Fragment() {
    val modelAchieved = SimpleBooleanProperty(true) // pretend this is model.achieved
    val achievedColor = modelAchieved.objectBinding { isAchieved ->
        if (isAchieved == true) Color.RED
        else Color.GREEN
    }

    override val root = vbox {
        togglebutton("Toggle") {
            selectedProperty().bindBidirectional(modelAchieved)
        }
        rectangle(width = 50, height = 50) {
            stroke = Color.BLACK
            fillProperty().bind(achievedColor)
        }
    }
}

我还将双向绑定viewmodel和fragment的项属性,以便它们保持同步。或者只使用常规片段,并自行引用模型的item属性。

太好了,谢谢!太好了,谢谢!