首页 文章

根据 property 选择代表

提问于
浏览
3

我有一个listview,我想使用defaultDelegate或customDelegate,具体取决于属性的值 . 到目前为止,我已尝试使用组件加载不同的委托:

Component{
    id: delegate
    Loader {
        sourceComponent: type == 3 ? customDelegate : defaultDelegate
    }
}

但是,我无法从我的两位代表那里访问我的模型中的属性 . 我有以下错误:

ReferenceError: name is not defined

这是我使用的模型:

ListModel {
     id: test
     ListElement {
         name: "Bill"
         team: "554"
         type: 2
     }
     ListElement {
         name: "John"
         team: "555"
         type: 3
     }
     ListElement {
         name: "Sam"
         team: "556"
         type: 1
     }
 }

有谁有任何想法,我在这里做错了什么?

1 回答

  • 3

    当然,这是一个背景问题 . 在您的代码中,由 ListView 插入到 delegate 的上下文中的 nameteamtype 上下文属性对于委托中的组件是不可访问的,因为 Loader 在实例化它们时使用 customDelegatedefaultDelegate 的创建上下文作为父上下文,并且 nameteamtype 不引用具有该上下文链的任何内容 . 一种解决方案是将所需信息显式设置为 Loader 的属性(这是有效的,因为 Loader 将自身设置为正在加载的组件的上下文对象) .

    下面是一个工作示例:

    ListModel {
         id: testModel
         ListElement {
             name: "Bill"
             team: "554"
             type: 2
         }
         ListElement {
             name: "John"
             team: "555"
             type: 3
         }
         ListElement {
             name: "Sam"
             team: "556"
             type: 1
         }
     }
    
    ListView {
        anchors.fill: parent
        model: testModel
    
        delegate: myDelegate
    }
    
    Component {
        id: myDelegate // yourDelegate
        Loader {
            property string modelName: model.name
            property string modelTeam: model.team
            property int modelType: model.type
            sourceComponent: modelType === 3 ? colonDelegate : semicolonDelegate
        }
    }
    
    Component {
        id: colonDelegate
        Text { text: modelName + ": " + modelTeam }
    }
    
    Component {
        id: semicolonDelegate
        Text { text: modelName + "; " + modelTeam }
    }
    

    为了进一步阅读和改进,我强烈建议您阅读this .

相关问题