为什么可以';在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
→ <代码>BA
→ <代码>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
。我同意你的看法。