将域 类 包装到 ItemViewModel

Wrapping domain classes to ItemViewModel

我有一个域名class

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 存储这些对象

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)
            }   
        }
    }
}

此外,如果您的 table 是只读的,您可以将 UserItemModel 定义为简单数据 class - 无需扩展 ItemViewModel 或执行 属性 绑定。