双向绑定绑定失败
Bidirectional binding fails to bind
以下是 Pro ScalaFX 的示例:
package proscalafx.ch03
import scalafx.beans.property.StringProperty
object BidirectionalBindingExample extends App {
println("Constructing two StringProperty objects.")
val prop1 = new StringProperty("")
val prop2 = new StringProperty("")
println("Calling bindBidirectional (<==>).")
prop2 <==> prop1
println("prop1.isBound = " + prop1.isBound)
println("prop2.isBound = " + prop2.isBound)
println("Calling prop1.set(\"prop1 says: Hi!\")")
prop1() = "prop1 says: Hi!"
println("prop2.get returned:")
println(prop2())
println( """Calling prop2.set(prop2.get + "\nprop2 says: Bye!")""")
prop2() = prop2() + "\nprop2 says: Bye!"
println("prop1.get returned:")
println(prop1())
}
两个StringProperty
对象应该是相互绑定的,当其中一个更新时,另一个也应该更新。这不是真的:
Constructing two StringProperty objects.
Calling bindBidirectional (<==>).
prop1.isBound = false
prop2.isBound = false
Calling prop1.set("prop1 says: Hi!")
prop2.get returned:
prop1 says: Hi!
Calling prop2.set(prop2.get + "\nprop2 says: Bye!")
prop1.get returned:
prop1 says: Hi!
prop2 says: Bye!
这段代码没有问题。 prop1
和 prop2
相互双向绑定。当您查看您提供的输出时,情况显然如此。当 prop1
的值设置为 "prop1 says: Hi!" 时,prop2
的值也会更改,当您更改 prop2
时,prop1
也会更改。请仔细查看输出结果。
一件可能令人困惑的事情是 isBound
returns false
这两个属性。这是双向绑定的正确行为。只有当 属性 单向绑定到另一个时,isBound
才会 return 为真。因此,如果您将代码更改为:
prop2 <== prop1
println("prop1.isBound = " + prop1.isBound)
println("prop2.isBound = " + prop2.isBound)
你会得到
prop1.isBound = false
prop2.isBound = true
这就是 JavaFX 的工作原理,与 ScalaFX 无关。
以下是 Pro ScalaFX 的示例:
package proscalafx.ch03
import scalafx.beans.property.StringProperty
object BidirectionalBindingExample extends App {
println("Constructing two StringProperty objects.")
val prop1 = new StringProperty("")
val prop2 = new StringProperty("")
println("Calling bindBidirectional (<==>).")
prop2 <==> prop1
println("prop1.isBound = " + prop1.isBound)
println("prop2.isBound = " + prop2.isBound)
println("Calling prop1.set(\"prop1 says: Hi!\")")
prop1() = "prop1 says: Hi!"
println("prop2.get returned:")
println(prop2())
println( """Calling prop2.set(prop2.get + "\nprop2 says: Bye!")""")
prop2() = prop2() + "\nprop2 says: Bye!"
println("prop1.get returned:")
println(prop1())
}
两个StringProperty
对象应该是相互绑定的,当其中一个更新时,另一个也应该更新。这不是真的:
Constructing two StringProperty objects.
Calling bindBidirectional (<==>).
prop1.isBound = false
prop2.isBound = false
Calling prop1.set("prop1 says: Hi!")
prop2.get returned:
prop1 says: Hi!
Calling prop2.set(prop2.get + "\nprop2 says: Bye!")
prop1.get returned:
prop1 says: Hi!
prop2 says: Bye!
这段代码没有问题。 prop1
和 prop2
相互双向绑定。当您查看您提供的输出时,情况显然如此。当 prop1
的值设置为 "prop1 says: Hi!" 时,prop2
的值也会更改,当您更改 prop2
时,prop1
也会更改。请仔细查看输出结果。
一件可能令人困惑的事情是 isBound
returns false
这两个属性。这是双向绑定的正确行为。只有当 属性 单向绑定到另一个时,isBound
才会 return 为真。因此,如果您将代码更改为:
prop2 <== prop1
println("prop1.isBound = " + prop1.isBound)
println("prop2.isBound = " + prop2.isBound)
你会得到
prop1.isBound = false
prop2.isBound = true
这就是 JavaFX 的工作原理,与 ScalaFX 无关。