如何在委托中正确地将模型中的属性绑定到手工项目中的属性



我想为任意模型的ListView创建一个编辑委托。在委托中,我想使用从TextInput继承的自己的NeatInputNeatInput声明自己的属性realValue,将text绑定到realValue,并且为了使其双向,在textChanged信号更改realValue时。如预期:

/*NeatInput.qml*/
import QtQuick 2.0
TextInput {
width: 50
property real realValue: 0.0
text: realValue * 2
onTextChanged: {
realValue = Number.fromLocaleString(locale, text) / 2
}
}

现在,它在ListView中被简单地用作委托,在模型的someValue上绑定realValue,并且出于编辑目的,在realValueChanged:上写入someValue

/*main.qml*/
import QtQuick 2.12
import QtQuick.Controls 2.12

ApplicationWindow {
width: 500
height: 500
visible: true

ListView {
id: view
model: ListModel {
ListElement {
someValue: 50
}
}
anchors.fill: parent
delegate: Row {
NeatInput {
realValue: someValue
onRealValueChanged: someValue = realValue
}
SpinBox {
value: someValue
onValueChanged: someValue = value
}
Text {
width: 50
text: someValue
}
}
}
}

Text用于简单阅读,SpinBox用于标准项的读/写。

但这并没有像我预期的那样奏效:

  • SpinBox编辑仅更新Text
  • NeatInput进行编辑将更新SpinBoxText

因此,NeatInputsomeValue上的绑定以某种方式被破坏,但写入工作。如果我从NeatInput.qml中移除信号绑定onTextChanged,则:

  • SpinBox编辑更新TextNeatInput
  • NeatInput进行编辑时,什么都不更新

我应该怎么做才能让更新从两个编辑器到所有读者?

一般经验法则始终是:赋值破坏绑定。无论何时:

onTextChanged: {
realValue = Number.fromLocaleString(locale, text) / 2
}

它打破了你在这里创建的绑定:

realValue: someValue

因此,text第一次更改时,realValue将停止侦听对someValue的更新。

双向绑定总是很棘手,因为它们会变成圆形。我用你的代码玩了一分钟,并通过这样做使其工作:

ListView {
id: view
model: ListModel {
ListElement {
someValue: 50
}
}
anchors.fill: parent
delegate: Row {
NeatInput {
realValue: someValue
onRealValueChanged: someValue = realValue
property real someValueCopy: someValue
onSomeValueCopyChanged:
{
realValue = someValueCopy;
}
}
SpinBox {
value: someValue
onValueChanged: someValue = value
}
Text {
width: 50
text: someValue
}
}
}

相关内容

  • 没有找到相关文章

最新更新