2016-06-21 1 views
1

У меня есть это в файле с именем ChildItem.qml:Binding свойство детской собственности в QML

Item{ 
    property var childProperty 
} 

В другом файле с именем ParentItem.qml, я создаю родительский элемент и попытаться связать childProperty свойству родителя:

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

В main.qml я инстанцирует оба объекта и привязать ссылку родителя к ребенку:

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

Это дает мне ошибку Cannot assign a value directly to a grouped property на линии childItem.childProperty: parentProperty. Я оборачиваюсь этим, меняя родительский счет следующим образом:

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

Но это выглядит и чувствует себя очень искусственно. Есть ли лучшие способы сделать это или другие предложения по изменению структуры по-другому?

ответ

1
childItem.childProperty: parentProperty 

Это, к сожалению, невозможно в синтаксисе QML, хотя это было бы хорошо. Ограничение состоит в том, что привязки могут быть определены только в объявлении самого элемента, например. в этом случае в пределах ChildItem { ... }. В качестве временного решения, то Binding элемент может быть использован в других местах:

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

Но что, по общему признанию, является весьма громоздким, а также.

я бы, вероятно, попытается изменить структуру моей QML, чтобы избежать попадания в эту ситуацию, в первую очередь, может быть что-то вроде этого:

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

Спасибо, 'Binding' кажется, что он потенциально может быть однострочным. Второй вариант, к сожалению, невозможен в моем сценарии, поскольку родительские/дочерние объекты должны быть в своих отдельных файлах для повторного использования. –

-1

Хорошо, у вас есть несколько ошибок в коде. И логические, и синтаксические.

childItem.childProperty: parentProperty 

Эта строка не допускается сюда из-за смешения декларативного и императивного кода. И что будет, если childItem null? Замените его:

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

Следующая ошибка:

childItem: childId 

Просто Заменяйте childId с childID.

+0

Как это смешивание декларативного и императивного кода? Я вижу только декларативный код. И почему смешивание не допускается? – GrecKo

+0

@folibis 'childItem.childProperty: parentProperty' не является обязательным в малейшей степени. Ваш ответ даже не работает (и ничего не добавляет к моему обходу); он запускается только при изменении дочернего элемента, а не 'parentProperty', который является правильной логикой. –

+0

Ок, вы можете изменить событие на 'onParentPropertyChanged'. Я только что заметил, что строка в коде, который вы указали, синтаксически неверна. Присвоение здесь обязательного кода. – folibis