[英]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.