Я закончил тем, что поместил слушателя изменений в список, который обновляет диаграмму и помещает слушателей изменений во все соответствующие свойства Roll
s (которые также обновляют диаграмму):
barchart(x = CategoryAxis(), y = NumberAxis()) {
animated = true
updateData(this)
rolls.forEach {
it.nameProperty.onChange { updateData(this) }
it.results.onChange { updateData(this) }
}
rolls.onChange {
updateData(this)
it.addedSubList.forEach {
it.nameProperty.onChange { updateData(this) }
it.results.onChange { updateData(this) }
}
}
}
С этой целью я поместил функцию преобразования данных, о которой я упоминал в своем вопросе, в отдельную функцию:
fun updateData(chart: BarChart<String, Number>){
chart.data = rolls.map { roll ->
XYChart.Series<String, Number>(roll.name, roll.results.map { (result, chance) ->
XYChart.Data<String, Number>(result.toString(), chance)
}.asObservable())
}.asObservable()
}
Хотя решение все еще выглядит несколько грязным, поэтому, если кто-нибудь знает более чистый способ сделать это, я был бы признателенэто.