2017-07-21 1 views
0

J'ai une classe de domaineTornadoFX de domaine d'emballage à 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 */ 
} 

et une classe de stockage de ces objets

class Trades { 
    val saleableItems: ArrayList<UserItem> = ArrayList() 
    val soldAwaitingItems: ArrayList<UserItem> = ArrayList() 

    /* methods */ 
} 

saleableItems et soldAwaitingItems sont mis à jour à partir de Trades

Je veux afficher saleableItems en utilisant TableView afin que je puisse lier les données et View sans convertir p ropriétés aux propriétés TornadoFX donc j'enveloppées 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 
    } 
} 

Est-il possible d'envelopper Trades-ItemViewModel<Trades> pour que j'ai quelque chose comme

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

puis l'utiliser dans 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) 
    } 
} 

Répondre

1

Avez-vous essayé quelque chose dans ce genre?

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

En outre, si votre table est en lecture seule, vous pourriez être en mesure de définir UserItemModel comme une simple classe de données - pas besoin d'étendre ItemViewModel ou d'effectuer des liaisons de propriété.