为什么不能在JavaFX中将属性作为参数传递给Property#unbind()?

时间:2018-10-20 10:29:23

标签: java javafx bidirectional

让我们考虑一下Property接口的两种方法:

Property#unbind() 
Property#unbindBidirectional(Property<T> other) 

如我们所见,当我们要删除双向绑定时,可以传递要删除其绑定的属性。

但是,当我们删除单向绑定时,我们无法传递此类属性。怎么解释?

1 个答案:

答案 0 :(得分:1)

单向绑定

单向绑定所涉及的方法是bindunbindisBound

重要的是要知道单向绑定是一对一 1 。这样做是为了保持一致性。考虑一下如果同时允许多个单向绑定会发生什么情况。如果我们有:

AB
AC

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。但是,我在答案中保留了一对一,因为我认为它可以更好地说明单向绑定和双向绑定之间的区别。

双向绑定

双向绑定涉及的方法是bindBidrectionalunbindBidirectional

对于双向绑定,该关系为多对多。它们也独立于单向绑定。来自bindBidirectional

  

在此属性和另一个属性之间创建双向绑定。双向绑定独立于单向绑定而存在。因此,可以通过双向绑定将单向绑定添加到属性,反之亦然。但是,不鼓励这种做法。

     

一个属性可能具有多个双向绑定。

双向绑定允许使用这种多对多关系,因为它们会使每个Property互相镜像 。如果一个更改,其他更新。来自javafx.beans.property

  

还可以在两个属性之间定义双向绑定,以便两个属性始终包含相同的值。如果其中一个属性发生更改,则另一个属性将被更新。

这意味着双向绑定不会共享单向绑定所具有的一致性问题。请考虑以下内容:

ABC

如果A发生变化,则B将更新。由于B已更新,因此C也将更新。这意味着在任何给定时间,所有属性都具有相同的值。没有歧义。

由于这种多对多关系,解除绑定时需要目标Property ;绑定的Property需要知道哪个 Property要与之解除绑定。