2017-05-25 3 views
0

Ich benutze TornadoFX 1.7.5 und ich kann nicht scheinen, gebundene Eigenschaften zu funktionieren. Ich habe die unten ItemViewModelsGebundene Eigenschaften nicht funktioniert

class DynamicMenuViewModel : ItemViewModel<DynamicMenu>(DynamicMenu()) { 
    val title = bind { item?.title?.toProperty() } 
    val isBold = bind { item?.isBold?.toProperty() } 
    val routes = bind { item?.routes?.toProperty() } 
} 
data class DynamicMenu(var title: String = "", var isBold: Boolean = false, var routes: MutableList<MenuRouteViewModel> = mutableListOf()) 

class MenuRouteViewModel : ItemViewModel<MenuRoute>(MenuRoute()) { 
    val url = bind { item?.url?.toProperty() } 
    val title = bind { item?.title?.toProperty() } 
    val isBold = bind { item?.isBold?.toProperty() } 
    val showNew = bind { item?.showNew?.toProperty() } 
} 
data class MenuRoute(var url: String = "", var title: String = "", var showNew: Boolean = false, var isBold: Boolean = false) 

die wie folgt gebunden sind:

//routesController.dynamicMenu is an instance of DynamicMenuViewModel() 

textfield(property = routesController.dynamicMenu.title) { 
    prefWidth = formWidth * .5 
    gridpaneConstraints { 
    columnRowIndex(0, 1) 
    marginLeft = 10.0 
    columnSpan = 2 
    marginBottom = 20.0 
    } 
} 

checkbox(property = routesController.dynamicMenu.isBold){ 
    gridpaneConstraints { 
    columnRowIndex(2, 1) 
    marginLeft = 15.0 
    marginBottom = 20.0 
    } 
} 

Dann werden die folgenden Funktionen verpflichten, die Modelle und druckt sie auf dem Bildschirm, wenn ich auf eine Schaltfläche klicken:

fun onClick(){ 
    commitModel() 
    println(dynamicMenu.item.toString()) 
    dynamicMenu.item.routes.forEach { 
     println(it.item.toString()) 
    } 
    } 

    fun commitModel(){ 
    dynamicMenu.item.routes.forEach { 
     it.commit() 
    } 
    dynamicMenu.commit() 
    } 

Das Problem ist, dass, wenn ich das Programm ausführen und die Textfelder und Kontrollkästchen bearbeiten, dann klicken Sie auf die Schaltfläche, die onClick() ausgeführt wird, scheint die Sicherung Element nicht aktualisiert werden d. Daher wird keiner der aktualisierten Werte auf der Konsole ausgegeben.

Was mache ich hier falsch?

Antwort

1

Das ViewModel kann, wie Sie wahrscheinlich wissen, nur bidirektional gegen JavaFX-Eigenschaften binden. Ihre Domänenobjekte enthalten keine JavaFX-Eigenschaften, daher müssen Sie sie konvertieren. Die toProperty()-Funktion, die Sie verwenden, funktioniert jedoch nur für einen Wert und wandelt es in eine Eigenschaft um. Diese Eigenschaft kann nicht über ihren Feldeigentümer informiert werden und kann daher nicht in das Domänenobjekt zurückschreiben.

Zum Glück kann man die observable Funktion verwenden, um Ihre Domain-Objekt-Eigenschaften als auch beschreibbar zu machen:

val url = bind { item?.observable(MenuRoute::url) }

Da die observable Funktion auf eine bestimmte Instanz eines Objekts MenuRoute arbeitet, ist es nun genügend Informationen hat um in diese Instanz zu schreiben, wenn Sie das Modell commit().

Wenn Sie die Eigenschaften in Ihren Domain-Objekten zu ändern halten beobachtbar sein, könnten Sie schreiben:

val url = bind(MenuRoute::url)

Sie die Inspektion TornadoFX IDEA-Plugin verwenden kann „Wandeln Sie alle Eigenschaften TornadoFX Eigenschaften“ automatisch überarbeiten Sie Ihre Eigenschaften. Dies würde verwandeln Sie Ihr MenuRoute Objekt in:

class MenuRoute { 
    val isBoldProperty = SimpleBooleanProperty(false) 
    var isBold by isBoldProperty 

    val showNewProperty = SimpleBooleanProperty(false) 
    var showNew by showNewProperty 

    val urlProperty = SimpleStringProperty("") 
    var url by urlProperty 

    val titleProperty = SimpleStringProperty("") 
    var title by titleProperty 
} 

(Sie müssen manuell den data Modifikator auf Ihrer Klasse Entfernen Sie auch passen, dass die aktuelle Version des Plugins einen Fehler in der Konvertierungsfunktion hat, die die alten Parameter verlassen würde. - Eine neue Version wird in Kürze veröffentlicht.

Wenn Sie das aus verschiedenen Gründen nicht tun wollen, konnte ich nur diese nette Syntax sogar für veränderbare Vars unterstützen, so wie Sie haben, so dass Sie diese Syntax in TornadoFX 1.7.6 sogar in Ihren verbindlichen Anweisungen verwenden können wenn Sie wollen nicht Ihre Datenklassen ändern:

val url = bind(MenuRoute::url)

Verwandte Themen