Как в TornadoFX изменить одно свойство при изменении других свойств?

Например, я хочу сделать следующее: у меня есть StringProperty, и это комбинация IntegerProperty и другого StringProperty, например:

  • StringProperty A = "foo"
  • Целое свойство B = 3
  • результирующее StringProperty C = "foo 3"

Как я могу «привязать» свойства, чтобы C менялось при изменении A или B? (Обратите внимание, что я не хочу реагировать на изменения, внесенные в C)

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


person Aleksandar Stefanović    schedule 07.02.2017    source источник


Ответы (1)


stringBinding это то, что вы хотите. Первый аргумент станет this внутри блока вычислений, и если 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.

person Edvin Syse    schedule 07.02.2017
comment
Я думаю, вам нужно либо stringBinding(a, b) { "${a.get()} ${b.get()}" }, либо stringBinding(a, b) { "$(a.value) ${b.value}" }. Свойства JavaFX показывают больше, чем просто их значение по умолчанию toString(). - person Ruckus T-Boom; 07.02.2017