如何在项目 属性 更改时更新 ItemFragment
How to update ItemFragment when item property changes
我对 ItemViewModel
与其基础项目之间的关系感到很困惑。我试图在屏幕上显示徽章,然后如果徽章在另一个线程上“实现”,徽章应该在屏幕上更新。
现在,徽章代码如下所示:
class Badge {
val achievedProperty = SimpleBooleanProperty(this, "achieved", false)
var achieved by achievedProperty
}
class BadgeModel: ItemViewModel<Badge>() {
val achieved = bind(Badge::achievedProperty)
}
接下来,我想在屏幕上显示它,在 ItemFragment
子类中:
class BadgeFragment(badge: Badge): ItemFragment<Badge>() {
private val model: BadgeModel by inject()
init {
model.item = badge
}
override val root = rectangle {
width = 50
height = 50
stroke = Color.BLACK
fill = if (model.achieved) Color.RED else Color.GREEN
}
}
开始时效果很好,但如果我随后设置 badge.achieved = true
(在我的控制器中),屏幕上的徽章颜色不会改变。
我显然遗漏了一些关于对象和模型之间关系的信息,但我在从文档中弄清楚它时遇到了很多麻烦。有人可以帮我让我的片段按照我想要的方式工作吗?
您的问题并非特定于模型或几乎任何与 TornadoFX 相关的问题。您编写它的方式只在创建时检查一次颜色。您需要使用属性或绑定来监听 属性 变化:
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)
}
}
}
我还会将视图模型和片段的项目属性双向绑定在一起,以便它们保持同步。或者只使用常规片段,并单独引用模型的项目属性。
我对 ItemViewModel
与其基础项目之间的关系感到很困惑。我试图在屏幕上显示徽章,然后如果徽章在另一个线程上“实现”,徽章应该在屏幕上更新。
现在,徽章代码如下所示:
class Badge {
val achievedProperty = SimpleBooleanProperty(this, "achieved", false)
var achieved by achievedProperty
}
class BadgeModel: ItemViewModel<Badge>() {
val achieved = bind(Badge::achievedProperty)
}
接下来,我想在屏幕上显示它,在 ItemFragment
子类中:
class BadgeFragment(badge: Badge): ItemFragment<Badge>() {
private val model: BadgeModel by inject()
init {
model.item = badge
}
override val root = rectangle {
width = 50
height = 50
stroke = Color.BLACK
fill = if (model.achieved) Color.RED else Color.GREEN
}
}
开始时效果很好,但如果我随后设置 badge.achieved = true
(在我的控制器中),屏幕上的徽章颜色不会改变。
我显然遗漏了一些关于对象和模型之间关系的信息,但我在从文档中弄清楚它时遇到了很多麻烦。有人可以帮我让我的片段按照我想要的方式工作吗?
您的问题并非特定于模型或几乎任何与 TornadoFX 相关的问题。您编写它的方式只在创建时检查一次颜色。您需要使用属性或绑定来监听 属性 变化:
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)
}
}
}
我还会将视图模型和片段的项目属性双向绑定在一起,以便它们保持同步。或者只使用常规片段,并单独引用模型的项目属性。