让我们考虑一下Property
接口的两种方法:
Property#unbind()
Property#unbindBidirectional(Property<T> other)
如我们所见,当我们要删除双向绑定时,可以传递要删除其绑定的属性。
但是,当我们删除单向绑定时,我们无法传递此类属性。怎么解释?
答案 0 :(得分:1)
单向绑定所涉及的方法是bind
,unbind
和isBound
。
重要的是要知道单向绑定是一对一 1 。这样做是为了保持一致性。考虑一下如果同时允许多个单向绑定会发生什么情况。如果我们有:
A
→B
A
→C
A
应该包含什么? B
的值还是C
的值? bind
的合同要求Property
始终必须包含ObservableValue
的值。来自javafx.beans.property
:
所有属性都可以绑定到相同类型的ObservableValues,这意味着该属性将始终包含与绑定的ObservableValue相同的值。
如果要观察的Property
个以上,则ObservableValue
无法维持此合同。因此,实现了一对一的 1 关系。
由于这种一对一的 1 关系,调用ObservableValue
时不必传递unbind
。唯一可能的ObservableValue
就是先前通过bind
给出的那个。
值得一提的是,在已经绑定的bind
上调用Property
会与上一个ObservableValue
隐式解除绑定。至少,这就是标准实现的工作方式。我找不到定义此行为的文档,因此我想实现可能会引发异常。
1。从技术上讲,这是一个多对一关系。可以将多个Property
绑定到同一ObservableValue
,但是不能将一个Property
绑定到多个ObservableValue
。但是,我在答案中保留了一对一,因为我认为它可以更好地说明单向绑定和双向绑定之间的区别。
双向绑定涉及的方法是bindBidrectional
和unbindBidirectional
。
对于双向绑定,该关系为多对多。它们也独立于单向绑定。来自bindBidirectional
:
在此属性和另一个属性之间创建双向绑定。双向绑定独立于单向绑定而存在。因此,可以通过双向绑定将单向绑定添加到属性,反之亦然。但是,不鼓励这种做法。
一个属性可能具有多个双向绑定。
双向绑定允许使用这种多对多关系,因为它们会使每个Property
互相镜像 。如果一个更改,其他更新。来自javafx.beans.property
:
还可以在两个属性之间定义双向绑定,以便两个属性始终包含相同的值。如果其中一个属性发生更改,则另一个属性将被更新。
这意味着双向绑定不会共享单向绑定所具有的一致性问题。请考虑以下内容:
A
↔B
↔C
如果A
发生变化,则B
将更新。由于B
已更新,因此C
也将也更新。这意味着在任何给定时间,所有属性都具有相同的值。没有歧义。
由于这种多对多关系,解除绑定时需要目标Property
;绑定的Property
需要知道哪个 Property
要与之解除绑定。