繁体   English   中英

如何在 QML 中的元素创建期间更改属性绑定?

[英]How to change a property binding during an element creation in QML?

假设我有一个自定义CheckBox

//MyCheckBox.qml

CheckBox {
  required property QtObject proxy

  checked: proxy.value

  Binding {
    target:    proxy
    property:  "value"
    value:     checked
  }
}

因此, MyCheckBox的选中状态绑定到我的 object( proxy )的value属性,反之亦然,即我有双向绑定。

我正在使用我的自定义复选框,如下所示:

//My window
Item {

  ...

  MyCheckBox {
    id:    ordinaryCheck
    proxy: ...
  }

  ...
}

一切都按预期工作。 但是,如果我需要反转MyCheckBox的某些实例的逻辑怎么办:proxy.value为 true 时,复选框未选中,而当proxy.value为 false 时,复选框被选中 但是,ofc 不起作用,因为如果我尝试这样做,这里有一个绑定循环:

Item {

...

  MyCheckBox {
    id:    invertedCheck

    proxy:     ...
    checked:   !proxy.value

    Binding {
      target:    proxy.value
      property:  "value"
      value:     !checked
    }
}

Qt 绑定也不是一个选项:

//MyCheckBox.qml

CheckBox {
  required property QtObject proxy

  checked: proxy.value

  Component.onCompleted {
    property.value = Qt.binding(function() { return checked });
  }
}

在这种情况下,我有相同的绑定循环错误

那么我要达到目标的选择是什么,如何在实例化时交替绑定?

如果您担心潜在的绑定循环,则可以将其重写为命令式实现,例如

CheckBox {
    required property QtObject proxy

    onCheckedChanged: {
        if (proxy && proxy.value !== checked) {
            proxy.value = checked;
        }
    }

    property bool proxyValue: proxy && proxy.value ? true : false

    onProxyValueChanged: {
        if (checked !== proxyValue) {
            checked = proxyValue;
        }
    }
}

您的第一个版本在技术上也可能是一个绑定循环,但未被检测到。

您想要将您的复选框值绑定到您的代理值,并且当用户切换您想要修改代理值的复选框时。

为避免绑定循环,请为每个组件使用特定的交互信号,而不是通用的 onChanged 信号。 前者仅在用户与 UI 交互时触发,后者每次都会触发,即使更改来自后端更改,也会导致潜在的绑定循环。 在您的情况下,您需要toggled信号

//MyCheckBox.qml

CheckBox {
  required property QtObject proxy
  checked: proxy.value
  onToggled: proxy.value = checked
}

请注意,这仅适用于 QQC2,因为当用户切换复选框时它们不会破坏checked: proxy.value绑定,但仍会更改checked属性值,希望最终得到解决。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM