Сильная привязка по умолчанию для свойства qml пользовательского компонента для двусторонней привязки - PullRequest
0 голосов
/ 29 декабря 2018

Я хочу создать пользовательский компонент, который позволяет двустороннюю привязку со следующей (традиционной) настройкой:

// main.qml
property var someStoredValue: someInitialValue // may be C++ property in real application
MyCustomComponent
{
    myProperty: someStoredValue // this binding will be destroyed on user input
    onMyPropertyChanged: someStoredValue = myProperty
}

// MyCustomComponent.qml
Item
{
    property var myProperty: null
    MouseArea
    {
        anchors.fill: parent
        onClicked: myProperty = "some text or other value" // breaks the binding set in main.cpp
    }
}

MyCustomComponent должен иметь возможность обновлять myProperty (программно), безразрушая связь между someStoredValue и myProperty.Как я могу изменить реализацию MyCustomComponent для достижения моей цели?

1 Ответ

0 голосов
/ 29 декабря 2018

Одним из решений было бы использование объекта Binding для обновления myProperty внутри MyCustomComponent вместо прямого изменения значения:

// MyCustomComponent.qml
Item
{
    property var myProperty: null
    Binding on myProperty
    {
        id: myPropertyUpdater
        function set(newValue) {value = newValue; when = true; when = false;}
        when: false
    }

    MouseArea
    {
        anchors.fill: parent
        onClicked: myPropertyUpdater.set("some text or other value")
    }
}

Хитрость заключается в том, чтобы в скором времени установить whenсвойство Binding в true, чтобы распространять новое значение.После инактивации Binding (when = false;) любое предыдущее прямое связывание будет восстановлено, как указано в документах :

Когда связывание снова станет неактивным, любое прямоепривязки, которые ранее были установлены для свойства, будут восстановлены.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...