TornadoFX将域类包装到ItemViewModel

我有一个域类

class UserItem(var simpleItem: Item, var id: String, var status: String, var price: Int) { var upperLimit: Int = 0 var lowerLimit: Int = 0 /* methods here */ } 

和一个存储这些对象的类

 class Trades { val saleableItems: ArrayList<UserItem> = ArrayList() val soldAwaitingItems: ArrayList<UserItem> = ArrayList() /* methods */ } 

saleableItemssoldAwaitingItemsTrades内更新

我想使用TableView显示saleableItems这样我就可以绑定数据和视图,而无需将属性转换为TornadoFX属性,因此我将UserItem包装到ItemViewModel

 class UserItemModel(uItem: UserItem) : ItemViewModel<UserItem>() { val simpleItem = bind { item?.observable(UserItem::simpleItem) } val id = bind { item?.observable(UserItem::id) } val status = bind { item?.observable(UserItem::status) } val price = bind { item?.observable(UserItem::price) } val upperLimit = bind { item?.observable(UserItem::upperLimit) } val lowerLimit = bind { item?.observable(UserItem::lowerLimit) } init { item = uItem } } 

有没有什么办法把Trades ItemViewModel<Trades>这样我就有了类似的东西

 class TradesModel : ItemViewModel<Trades>() { val saleableItems: ObservableList<UserItemModel> val soldAwaitingItems: ObservableList<UserItemModel> } 

然后在View使用它

 class TradesView : View("My View") { val tradesModel: TradesModel by inject() tableview(tradesModel.saleableItems) { column("Name", UserItemModel::simpleItem) column("Price", UserItemModel::price) column("Lower limit", UserItemModel::lowerLimit) column("Upper limit", UserItemModel::upperLimit) } } 

你有没有尝试过这样的事情?

 class UserItemModel(uItem: UserItem) : ItemViewModel<UserItem>() { // Same way you defined previously. } class TradesViewModel { val saleableItems: SimpleListProperty<UserItemModel>(FXCollections.observableArrayList()) val soldAwaitingItems: SimpleListProperty<UserItemModel>(FXCollections.observableArrayList()) } class TradesView : View("My View") { val tradesModel: TradesViewModel by inject() init { with(root) { tableview(tradesModel.saleableItems) { column("Name", UserItemModel::simpleItem) column("Price", UserItemModel::price) column("Lower limit", UserItemModel::lowerLimit) column("Upper limit", UserItemModel::upperLimit) } } } } 

另外,如果你的表是只读的,你可能能够将UserItemModel定义为一个简单的数据类 – 不需要扩展ItemViewModel或执行属性绑定。