如何在项目 属性 更改时更新 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)
        }
    }
}

我还会将视图模型和片段的项目属性双向绑定在一起,以便它们保持同步。或者只使用常规片段,并单独引用模型的项目属性。