Я пытаюсь понять, почему привязка данных работает так, как она работает в JavaFX. Это позволяет связывать ObservableValue
s с другими ObservableValue
s следующим образом:
val prop0 = SimpleStringProperty("xul")
val prop1 = SimpleStringProperty("baz")
prop0.bind(prop1)
Когда я сделаю это, оба свойства будут иметь значение baz
.
Я также могу связать цепи:
val prop0 = SimpleStringProperty("xul")
val prop1 = SimpleStringProperty("baz")
val prop2 = SimpleStringProperty("qux")
prop0.bind(prop1)
prop1.bind(prop2)
// all will have the value "qux"
В документах сказано, что я не могу установить значение свойства, которое связано:
prop0.value = "foo" // exception
хотя у меня могут быть циклические привязки:
val prop0 = SimpleStringProperty("xul")
val prop1 = SimpleStringProperty("baz")
val prop2 = SimpleStringProperty("wom")
prop0.bindBidirectional(prop1)
prop1.bindBidirectional(prop2)
prop2.bindBidirectional(prop0)
но простая двунаправленная привязка приведет к StackOverflowError
:
prop0.bindBidirectional(prop1)
prop1.bindBidirectional(prop0)
Вот почему (наверное) существует явный способ двунаправленного связывания :
val prop0 = SimpleStringProperty("xul")
val prop1 = SimpleStringProperty("baz")
val prop2 = SimpleStringProperty("wom")
prop0.bindBidirectional(prop1)
prop0.bindBidirectional(prop2)
Чего я не понимаю, так это того, почему JavaFX ограничивает однонаправленное связывание значения несколькими другими значениями:
val prop0 = SimpleStringProperty("xul")
val prop1 = SimpleStringProperty("baz")
val prop2 = SimpleStringProperty("qux")
prop0.bind(prop1)
// this will unbind prop0 from prop1
prop0.bind(prop2)
но позволяет мне создать любое число BidirectionalBinding
с? Почему существует различие между этими понятиями, когда двунаправленное связывание должно быть двумя однонаправленными связями?
Также странно, что существует интерфейс Binding
, который создает новую сущность, которая будет зависеть от источника ObservableValue
s:
val num1 = SimpleIntegerProperty(1)
val num2 = SimpleIntegerProperty(2)
// creates a new binding, which will change its value
// whenever num1 or num2 changes
val sum = num1.add(num2)
, который может быть dispose
d:
sum.dispose()
но когда я звоню bind
или bindBidirectional
, он не возвращает одноразовое Binding
.
Я читаю документы, но это не объясняется в них. Я что-то пропустил? Какая внутренняя логика делает такое поведение необходимым?