2016-06-21 18 views
1

Ich habe diese in einer Datei ChildItem.qml genannt:Bindungseigenschaft der Kinder Immobilien in qml

Item{ 
    property var childProperty 
} 

In einer anderen Datei ParentItem.qml genannt, ich das übergeordnete Element zu erstellen und versuchen, die childProperty auf eine Eigenschaft des Mutter zu binden:

Item{ 
    property ChildItem childItem: null 
    property var parentProperty 
    childItem.childProperty: parentProperty 
} 

In main.qml instanziiert ich beide Objekte und binden den Hinweis der Eltern auf das Kind:

ApplicationWindow{ 
    ChildItem{ 
     id: childID 
    } 
    ParentItem{ 
     id: parentID 
     childItem: childID 
    } 
} 

Dies gibt mir einen Cannot assign a value directly to a grouped property Fehler auf der childItem.childProperty: parentProperty Zeile. Ich arbeite darum, indem ich das Elternteil wie folgt ändere:

Item { 
    property ChildItem childItem: null 
    property var parentProperty 
    //childItem.childProperty: parentProperty 
    onParentPropertyChanged: childItem.childProperty = parentProperty 
} 

Aber das sieht und fühlt sich sehr künstlich an. Gibt es bessere Möglichkeiten, diese oder andere Vorschläge zu machen, um die Struktur auf andere Weise zu verändern?

Antwort

1
childItem.childProperty: parentProperty 

Das ist leider nicht möglich in QML-Syntax, obwohl es nett wäre. Die Einschränkung besteht darin, dass Bindungen nur innerhalb der Deklaration des Elements selbst definiert werden können, z. in diesem Fall innerhalb ChildItem { ... }.

Binding { 
    target: childItem 
    property: "childProperty" 
    value: parentProperty 
} 

Aber das zugegebenermaßen recht unhandlich auch: Als Abhilfe kann das Binding Element in anderen Orten eingesetzt werden.

Ich würde wahrscheinlich versuchen, die Struktur meiner QML zu ändern Einstieg in dieser Situation in erster Linie zu vermeiden, vielleicht so etwas wie folgt aus:

ApplicationWindow{ 
    ChildItem{ 
     id: childID 
     childProperty: parentID.parentProperty 
    } 
    ParentItem{ 
     id: parentID 
    } 
} 
+0

Danke, 'Binding' scheint, als könnte es ein One-Liner sein. Die zweite Option ist in meinem Szenario leider nicht möglich, da sich die Eltern-/Kindobjekte zur Wiederverwendbarkeit in ihren eigenen Dateien befinden müssen. –

-1

Ok, Sie haben mehrere Fehler im Code. Sowohl logische als auch syntaktische.

Diese Zeile ist hier nicht erlaubt, da deklarativer und imperativer Code gemischt wird. Was wird auch sein, wenn childItem null ist? Ersetzen Sie es mit:

onChildItemChanged: { 
    if(childItem) 
     childItem.childProperty = parentProperty; 
} 

Nächster Fehler:

childItem: childId 

Gerade REPLCE childId mit childID.

+0

Wie ist das deklarative und zwingend notwendig, Code Mischen? Ich sehe nur deklarativen Code. Und warum Mischen wäre nicht erlaubt? – GrecKo

+0

@folibis 'childItem.childProperty: parentProperty' ist nicht zwingend notwendig. Ihre Antwort funktioniert nicht einmal (und fügt meiner Problemumgehung nichts hinzu); Es wird nur ausgelöst, wenn das Kind geändert wird und nicht die "parentProperty", die die richtige Logik ist. –

+0

Ok, Sie können das Ereignis in 'onParentPropertyChanged' ändern. Ich habe gerade bemerkt, dass die Zeile in dem von Ihnen bereitgestellten Code syntaktisch falsch ist. Zuweisen ist zwingend Code hier. – folibis