Griffon 绑定不起作用

Griffon binding not working

我正在使用 Griffon 1.5 .. 在一个视图中,我有一个定义为 ..

的面板
panel(background: bind { model.background },
         visible: bind { model.stillageComplete },
         constraints: 'grow,wrap') {
     migLayout(layoutConstraints:'fill')
     label(text: bind{model.stateText}, constraints:'align center', foreground:   bind{model.foreground},
             font: new Font("Sans Serif", Font.BOLD, 20))
 }

在我的模型中..

 @Bindable
 @PropertyListener(stillageCompleteCheck)
 boolean toggle

 @Bindable
 stillageComplete = false

 @Bindable
 stateText

.. 以及其他字段和 属性 侦听器方法 ..

 private stillageCompleteCheck = { evt ->

    def contentsChecked = checkContents()

    stillageComplete =
            (currentContentCount == stillageSize && !(statusList.find { it != Color.green })

    println "StillageComplete  ?  ${stillageComplete} ${currentContentCount} ${stillageSize}"
    println "StateText         ?  ${stateText}"

}

我在控制器方法中设置了 model.toggle 变量,该方法运行 属性Listener 代码并正确设置了参数,但面板未显示。任何人都可以看到我的代码有问题吗?

顺便说一句..我有另一个面板,如下所示,可以正常工作..

panel(background: Color.yellow,
        visible: bind { model.stillageOverdue },
        constraints: 'grow,wrap') {
    migLayout(layoutConstraints: 'fill')
    label("Finish Time Overdue", constraints: 'align center', foreground: Color.red,
            font: new Font("Sans Serif", Font.BOLD, 20))
}

我认为问题出在下面一行

stillageComplete = (currentContentCount == stillageSize && !(statusList.find { it != Color.green })

这是一个典型的 Groovy 陷阱。从外面(model.stillageComplete = true)看起来是字段访问,实际上是model.setStillageComplete(true),换句话说,这实际上是属性访问。但是当从包含 "property" 的实例中调用相同的代码时,这条规则被推翻了,有效的字段访问胜出。所以发生的结果是 属性 stillageComplete 的预期 PropertyChangeEvent 没有被触发。

解决方法很简单,明确调用 setter 或自己触发 PCE。调用 setter 更容易。

setStllageComplete((currentContentCount == stillageSize && !(statusList.find { it != Color.green }))