代码之家  ›  专栏  ›  技术社区  ›  skiey

将域类包装到ItemViewModel

  •  1
  • skiey  · 技术社区  · 8 年前

    我有一个域类

    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 */
    }
    

    saleableItems soldAwaitingItems 从内部更新 Trades

    我想展示 使用 TableView 这样我就可以绑定数据和视图,而不用将属性转换为TornadFX属性,所以我包装了 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
        }
    }
    

    有什么办法包装吗 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)
        }
    }
    
    1 回复  |  直到 6 年前
        1
  •  1
  •   Trein    8 年前

    你试过这样的东西吗?

    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