У меня есть приложение tornadoFX, следующее за шаблоном MVVM с моделью:
data class Person (
val name: String,
val cars: List<Car>
)
data class Car (
val brand: String,
val model: String
)
Приложение определяет следующий вид:
Есть список, в котором перечислены все люди. Кроме того, listView - это подробное представление с текстовым полем для имени человека и табличное представление для автомобилей этого человека.
Двойной щелчок по записи автомобиля в таблице открывает диалоговое окно, в котором можно редактировать свойства автомобиля.
Я хочу, чтобы, если я открою сведения об автомобиле и отредактирую запись, изменения будут отражены в табличном представлении. Поскольку я не могу изменить модель автомобиля (которая является неизменяемым типом) путем добавления свойств fx, я придумал следующую модель представления:
class PersonViewModel(): ItemViewModel<Person> {
val name = bind(Person::name)
val cars = bind { SimpleListProperty<CarViewModel>(item?.cars?.map{CarViewModel(it)}?.observable()) }
override fun onCommit {
// create new person based on ViewModel and store it
}
}
class CarViewModel(item: Car): ItemViewModel<Car> {
val brand = bind(Car::name)
val model = bind(Car::model)
init {
this.item = item
}
}
Таким образом, если дважды щелкнуть запись автомобиля в табличном представлении и открыть подробное представление автомобиля, обновление автомобиля будет непосредственно отражено в табличном представлении.
Моя проблема здесь в том, что я не могу найти способ привязать грязные свойства всех моих CarViewModels в таблице к PersonViewModel. Поэтому, если я меняю машину, PersonViewModel не помечается как грязный.
Есть ли способ связать грязные свойства PersonViewModel и CarViewModel? (А также перепривязать их, если выбран другой человек).
Или есть еще лучший способ определить мои модели просмотра?