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属性。太好了,谢谢!太好了,谢谢!