【发布时间】:2019-04-05 17:01:30
【问题描述】:
我试图理解为什么数据绑定的工作方式与它在 JavaFX 中的工作方式相同。它可以让您将ObservableValues 绑定到其他ObservableValues,如下所示:
val prop0 = SimpleStringProperty("xul")
val prop1 = SimpleStringProperty("baz")
prop0.bind(prop1)
当我这样做时,两个属性的值都将是baz。
我也可以链接绑定:
val prop0 = SimpleStringProperty("xul")
val prop1 = SimpleStringProperty("baz")
val prop2 = SimpleStringProperty("qux")
prop0.bind(prop1)
prop1.bind(prop2)
// all will have the value "qux"
文档说我无法设置绑定属性的值:
prop0.value = "foo" // exception
虽然我可以有循环绑定:
val prop0 = SimpleStringProperty("xul")
val prop1 = SimpleStringProperty("baz")
val prop2 = SimpleStringProperty("wom")
prop0.bindBidirectional(prop1)
prop1.bindBidirectional(prop2)
prop2.bindBidirectional(prop0)
但是一个简单的双向绑定会产生一个StackOverflowError:
prop0.bindBidirectional(prop1)
prop1.bindBidirectional(prop0)
这就是为什么(我猜)有一种明确的方式来进行双向绑定:
val prop0 = SimpleStringProperty("xul")
val prop1 = SimpleStringProperty("baz")
val prop2 = SimpleStringProperty("wom")
prop0.bindBidirectional(prop1)
prop0.bindBidirectional(prop2)
我不明白为什么 JavaFX 限制将一个值单向绑定到多个其他值:
val prop0 = SimpleStringProperty("xul")
val prop1 = SimpleStringProperty("baz")
val prop2 = SimpleStringProperty("qux")
prop0.bind(prop1)
// this will unbind prop0 from prop1
prop0.bind(prop2)
但是让我创建任意数量的BidirectionalBindings?当一个双向绑定应该是两个单向绑定时,为什么这些概念之间存在差异?
还有点奇怪的是Binding 接口创建了一个新实体,该实体将依赖于源ObservableValues:
val num1 = SimpleIntegerProperty(1)
val num2 = SimpleIntegerProperty(2)
// creates a new binding, which will change its value
// whenever num1 or num2 changes
val sum = num1.add(num2)
可以是disposed:
sum.dispose()
但是当我调用bind 或bindBidirectional 时,它不会返回一次性Binding。
我阅读了文档,但其中没有解释这些内容。我错过了什么?使这种行为成为必要的内部逻辑是什么?
【问题讨论】:
-
您使用的是什么版本的 JavaFX?我在 JavaFX 11 中没有得到
StackOverflowError。
标签: java javafx data-binding kotlin