DevExpress ItemsView.QueryItemTemplate 无限循环

问题描述 投票:0回答:1

我正在尝试了解 DevExpress 的 ChatDemo。 在我的代码中,我有 2 个列表(联系人、消息),我将其用作数据源。

现在我的问题是,我的列表包含 2 个消息对象。为了单独显示每个,我使用 ItemsView.QueryItemTemplate 事件。就像演示版一样。

但是我的代码跳入无限循环,并且总是在 QueryItemTemplate 和 OnCustomizeItemEvent 之间跳转。

演示版代码

Private Sub OnQueryItemTemplate(ByVal sender As Object, ByVal e As QueryItemTemplateEventArgs)
    Dim message = TryCast(e.Row, DevAV.Chat.Model.Message)
    If message Is Nothing Then Return
    If message.IsOwnMessage Then
        Styles.MyMessage.Apply(e.Template)
    Else
        Styles.Message.Apply(e.Template)
    End If

    Dim fluent = mvvmContext.OfType(Of MessagesViewModel)()
    fluent.ViewModel.OnMessageRead(message)
End Sub

Private Sub OnCustomizeItem(ByVal sender As Object, ByVal e As CustomizeItemArgs)
    Dim message = TryCast(e.Row, DevAV.Chat.Model.Message)
    If message Is Nothing Then Return
    If message.IsLiked Then
        Dim btnLike = e.Element.FindElementById("btnLike")
        Dim btnMore = e.Element.FindElementById("btnMore")
        If btnLike IsNot Nothing AndAlso btnMore IsNot Nothing Then
            btnLike.Hidden = False
            btnMore.Hidden = True
        End If
    End If

    If message.IsFirstMessageOfBlock Then Return
    If Not message.IsOwnMessage Then
        Dim avatar = e.Element.FindElementById("avatar")
        If avatar IsNot Nothing Then avatar.Style.SetVisibility(Utils.Html.Internal.CssVisibility.Hidden)
    End If

    Dim name = e.Element.FindElementById("name")
    If name IsNot Nothing Then name.Hidden = True
    If Not message.IsFirstMessageOfReply Then
        Dim sent = e.Element.FindElementById("sent")
        If sent IsNot Nothing Then sent.Hidden = True
    End If
End Sub

我的代码:

    Private Sub IvMessages_QueryItemTemplate(sender As Object, e As DevExpress.XtraGrid.Views.Items.QueryItemTemplateEventArgs) Handles IvMessages.QueryItemTemplate
        Dim Message = TryCast(IvMessages.GetRow(e.RowHandle), MessageTest)

        If Message Is Nothing Then Return

        If Message.UserName = "Angelo" Then
            Dim Html = File.ReadAllText("C:\Users\Admin\Documents\Visual Studio 2022\Projects\SDSoftdent\SDControls\FrmChat\Resources\Html\OwnMessage.html")
            Dim CSS = File.ReadAllText("C:\Users\Admin\Documents\Visual Studio 2022\Projects\SDSoftdent\SDControls\FrmChat\Resources\Css\OwnMessage.css")
            IvMessages.HtmlTemplate.Template = Html
            IvMessages.HtmlTemplate.Styles = CSS
        Else
            Dim Html = File.ReadAllText("C:\Users\Admin\Documents\Visual Studio 2022\Projects\SDSoftdent\SDControls\FrmChat\Resources\Html\Message.html")
            Dim CSS = File.ReadAllText("C:\Users\Admin\Documents\Visual Studio 2022\Projects\SDSoftdent\SDControls\FrmChat\Resources\Css\Message.css")
            IvMessages.HtmlTemplate.Template = Html
            IvMessages.HtmlTemplate.Styles = CSS
        End If
    End Sub

我还测试了将 OnCustomizeEvent 放在注释中,但它什么也没做,仍然循环。

有人有想法吗?

来自 DevExpress 的文档: https://docs.devexpress.com/WindowsForms/DevExpress.XtraGrid.Views.Items.ItemsView.QueryItemTemplate

vb.net devexpress
1个回答
0
投票

您描述的问题的根源是事件的不正确使用 - 您正在修改整个视图的模板设置(ItemsView.HtmlTemplate 属性)而不是自定义

e.Template
事件的参数:

' incorrect approach
IvMessages.HtmlTemplate.Template = Html
IvMessages.HtmlTemplate.Styles = CSS
' correct code
e.Template.Template = Html
e.Template.Styles = CSS.

它强制 ItemsView 重新加载整个布局,并为 View 的每个项目再次触发所有自定义事件。

© www.soinside.com 2019 - 2024. All rights reserved.