2017-02-07 17 views
1

Например, я хочу, чтобы это сделать: у меня есть StringProperty, и это сочетание IntegerProperty и anoter StringProperty, как это:В TornadoFX, как я могу сделать одно изменение свойства при изменении других свойств?

  • StringProperty A = "Foo"
  • IntegerProperty B = 3
  • в результате StringProperty С = «Foo 3»

Как I «связывают» свойства так, что С меняется, когда либо А или Б меняются? (Обратите внимание, что я не хочу реагировать на изменения, внесенные в C)

Я пробовал использовать метод stringBinding(), но мне непонятно, как этот метод работает точно, и документация об этом неясно.

ответ

2

stringBinding - это то, что вы хотите. Первый аргумент будет внутри блока вычисления, и если this является наблюдаемым значением, оно будет добавлено как зависимость, используемая для вычисления, когда переплетная строка должна быть переоценена. Остальные параметры (только b здесь) добавляются также как переоценки.

Если вы делаете stringBinding(a, b) { "${a.value} ${b.value}" }, вы создали привязку к строкам, которая будет обновляться при изменении a или b. Поскольку this в приведенном выше примере a, можно также записать в stringBinding(a, b) { "${this.value} ${b.value}" }, но я не думаю, что делает его более ясным :)

Поэтому мы решили сделать первый элемент this становится более очевидным следующим пример:

val sizeDescription = bind(items) { "$size elements in list" }

Здесь вам не нужно ссылаться на items снова попасть в это size собственность.

+0

Мне кажется, вам нужно либо 'stringBinding (a, b) {" $ {a.get()} $ {b.get()} "}' или 'stringBinding (a, b) {" $ (a. value) $ {b.value} "}'. Свойства JavaFX показывают больше, чем их значение, по умолчанию 'toString()'. –

+0

Спасибо, Мэтью, обновит мой ответ :) –