为什么可以';在JavaFX中,我们是否将属性作为参数传递给属性#unbind()? 让我们考虑两种方法:属性< /代码>接口: Property#unbind() Property#unbindBidirectional(Property<T> other) Property#unbind() 物业#未绑定(物业其他)

为什么可以';在JavaFX中,我们是否将属性作为参数传递给属性#unbind()? 让我们考虑两种方法:属性< /代码>接口: Property#unbind() Property#unbindBidirectional(Property<T> other) Property#unbind() 物业#未绑定(物业其他),java,javafx,bidirectional,Java,Javafx,Bidirectional,正如我们所看到的,当我们想要移除双向绑定时,我们可以传递我们想要移除该绑定的属性 然而,当我们移除单向绑定时,我们不能传递这样的属性。如何解释它?单向绑定 单向绑定涉及的方法有bind、unbind和isBound 必须知道单向绑定是一对一的。这样做是为了保持一致性。考虑如果同时允许多个单向绑定会发生什么。如果我们有: A→ B A→ C A应该包含什么?B的值还是C的值?bind的合同要求属性始终包含可观察值的值。从javafx.beans.property: 所有属性都可以绑定到相同类型的O

正如我们所看到的,当我们想要移除双向绑定时,我们可以传递我们想要移除该绑定的属性

然而,当我们移除单向绑定时,我们不能传递这样的属性。如何解释它?

单向绑定 单向绑定涉及的方法有
bind
unbind
isBound

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

A
→ <代码>B
A
→ <代码>C

A
应该包含什么?
B
的值还是
C
的值?
bind
的合同要求
属性
始终包含
可观察值
的值。从
javafx.beans.property

所有属性都可以绑定到相同类型的ObservalEvalue,这意味着该属性将始终包含与绑定的ObservalEvalue相同的值

如果要遵守多个
可观察值
,则
属性
无法维护此合同。因此,一对一关系被强制执行

由于这种一对一的关系,调用
解除绑定
时不需要传递
observeValue
。唯一可能表示的
observeValue
是之前通过
bind
给出的值

值得一提的是,对已绑定的
属性
调用
bind
将隐式解除与前面的
observeValue
的绑定。至少,标准实现是这样工作的。我找不到定义此行为的文档,因此我认为实现可能会引发异常

一,。从技术上讲,这是一种多对一的关系。可以将多个
属性
绑定到同一
observeValue
,但该
属性
不能绑定到多个
observeValue
。但是,我在答案中保留了一对一,因为我认为它更好地说明了单向绑定和双向绑定之间的区别

双向绑定 双向绑定涉及的方法有
bindbiddirectional
unbindbidiodigital

对于双向绑定,关系是多对多的。它们也独立于单向绑定。从

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

一个属性可以有多个双向绑定

双向绑定允许这种多对多关系,因为它们使每个
属性
相互镜像。如果其中一个发生更改,另一个将更新。从
javafx.beans.property

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

这意味着单向绑定所具有的一致性问题不被双向绑定共享。考虑以下事项:

A
↔ <代码>B
↔ <代码>C

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


由于这种多对多关系,解除绑定时需要target
属性
;绑定的
属性
需要知道它需要从哪个
属性
解除绑定。

为什么要向
解除绑定()调用传递附加属性?您已经通过调用
unbind()
方法定义了要解除绑定的属性。您在哪里发现
isBound
是用于单向的?我在javadoc中找不到它。@Pavel_K我找不到说明
isBound
仅用于单向绑定的文档。然而,我可以说所有的标准实现都是这样的。@Pavel_K顺便说一句,从技术上讲,单向绑定是多对一的。一个以上的
属性
可以绑定到同一个
observeValue
,但是一个
属性
不能绑定到多个
observeValue
。我同意你的看法。