(也许我问这个非常愚蠢的问题真的很愚蠢,但我真诚地感谢一些示例代码的详细帮助)
我对编程非常陌生,尤其是对 WPF 非常陌生。这是我的第一个 WPF 应用程序,因此我没有任何与 MVVM 相关的知识。所以请不要将此问题链接到 MVVM,因为这是另一个主题,我也在努力学习。我想在没有 MVVM 的情况下解决这个问题。
现有代码简介:
我有一个用户控件(people_tile),没什么特别的,只是一堆标签,具有不同的字体大小、不同的外观等。当我创建这个用户控件的对象时,我将其中一个标签的内容更改为 ID 值数据库中有。其余的事情发生在用户控件内部,当它加载时。我敢肯定,经验丰富的程序员会记得他们开始的日子并嘲笑我,但我仍在学习。
现在,当谈到将这个用户控件带到屏幕上时,我有一个堆栈面板方法。当用户单击主屏幕上的按钮时,页面上会打开另一个用户控件。这个用户控件(people_page)中有一个堆栈面板,它与 people_tile 用户控件一起加载。我对绑定不是很好,所以我所做的只是运行一个 for 循环,将 ID 值传递给为 people_tile 用户控件创建的对象,然后将此 people_tile 控件作为子项添加到 people_page 用户控件上可用的堆栈面板.
问题陈述
所有这一切都工作得很好,没有任何问题或问题,除了当数据增加时,将 people_tile 用户控件添加到 people_page 用户控件的 stackpanel 控件需要很长时间。目前我在 people 表中有大约 1200 个项目。但问题早在 500 件商品本身就开始了。在面板内创建这么多用户控件需要花费大量时间。
需要帮助
我如何在这里使用虚拟化。我已经通过阅读其他帖子尝试了 VirtualizingStackpanels 作为一个选项,但我认为如果我们不使用 Binding 就没有任何意义,所以基本上如果有人可以在以下方面帮助我
使用绑定加载我的用户控件列表(我认为使用的术语是可观察的集合,但我在这里可能完全错了)
将此用户控件列表加载为 ListBox,或直接在我的面板中,或通过 ItemsControl,以最首选的方式为准
请注意,用户控件的数据上下文应该是用户控件本身,因为我在用户控件中填充的其他数据仅使用在 people_tile 用户控件的初始化子中定义的 Datacontext = Me 语句。
最后,用户控件上有一个单击事件,它在代码中单独执行了很多操作。我们也需要保留这一点。我的意思是,如果我们使用 ListBox 来保存用户控件,那么我可能会失去单个用户控件的点击功能。我不要那个。
真诚的请求:我对 Binding 不太熟悉或精通,所以如果您提到 Binding,请告诉我我需要在代码中进行哪些更改以及在哪里进行更改
我用 ListBox 方法尝试过的一些代码参考
在我创建的 XAML 中
<ListBox x:Name="ListBox_Main">
<ListBox.ItemTemplate>
<DataTemplate>
<local:UserControl_Tile_People/>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
在后面的代码中我有这个
将项目暗淡为 List(Of UserControl_Tile_People) = New List(Of UserControl_Tile_People)()
For row_cntr = 0 To global_dt_people_master_list.Rows.Count - 1
Dim objTile As New UserControl_Tile_People
objTile.lblPerson_id.Content = global_dt_people_master_list.Rows(row_cntr).Item("bp_id").ToString
objTile.DataContext = objTile
items.Add(New UserControl_Tile_People() With {
.id_value_passed = global_dt_people_master_list.Rows(row_cntr).Item("bp_id").ToString
})
Next
Me.ListBox_Main.ItemsSource = items
这并没有给我任何虚拟化。它也不加载用户控件。我的用户控件的代码如下
XAML 部分
和用户控件背后的代码
Private Sub UserControl_Tile_People_Loaded(sender As Object, e As RoutedEventArgs) Handles Me.Loaded
Me.lblPerson_id.Content = id_value_passed
lbl_person_id_changed()
End Sub
Public Sub lbl_person_id_changed()
Dim id_value As String = ""
If Me.lblPerson_id.Content <> "0" Then
id_value = Me.lblPerson_id.Content
prp_Person_Print_Name = id_value
prp_Mobile_Number = id_value
prp_LRP_Points = id_value
prp_LRP_cadre = id_value
prp_Person_Type = id_value
End If
End Sub
Dim pvt_Person_Print_Name As String
Public Property prp_Person_Print_Name As String
Get
Return pvt_Person_Print_Name
End Get
Set(value As String)
pvt_Person_Print_Name = value
RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs("Prp_Person_Print_Name"))
End Set
End Property
我能够自己解决它,而无需使用任何 MVVM。感谢所有的支持。