Почему мы не можем передать свойство в качестве аргумента свойству # unbind () в JavaFX? - PullRequest
0 голосов
/ 20 октября 2018

Давайте рассмотрим два метода интерфейса Property:

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

Как мы видим, когда мы хотим удалить двунаправленную привязку, мы можем передать свойство, для которого мы хотим удалить эту привязку.

Однако, когда мы удаляем однонаправленную привязку, мы не можем передать такое свойство.Как это объяснить?

1 Ответ

0 голосов
/ 20 октября 2018

Однонаправленные привязки

Методы, используемые для однонаправленных привязок: bind, unbind и isBound.

Важно знать, что однонаправленные привязки one-в-одном 1 .Это сделано для поддержания последовательности.Подумайте, что произойдет, если будет разрешено несколько однонаправленных привязок одновременно.Если у нас есть:

AB
AC

Что должно содержать A?Значение B или значение C?Контракт bind требует, чтобы Property будет всегда содержать значение ObservableValuejavafx.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:

Также возможно определить двунаправленную привязку между двумя свойствами, чтобы оба свойства всегда содержали одно и то же значение.Если одно из свойств изменится, другое будет обновлено.

Это означает, что проблема согласованности, которой обладают однонаправленные привязки, не разделяется двунаправленными привязками.Обратите внимание на следующее:

ABC

Если A изменится, то B обновится.Поскольку B обновлен, C будет также обновляться.Это означает, что в любой момент времени все свойства имеют одинаковое значение.Нет двусмысленности.

Как следствие этого отношения «многие ко многим», цель Property является необходимой для отмены привязки;градиент Property должен знать , с которого Property он должен отвязаться.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...