我正在尝试了解 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
您描述的问题的根源是事件的不正确使用 - 您正在修改整个视图的模板设置(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 的每个项目再次触发所有自定义事件。