0

(也许我问这个非常愚蠢的问题真的很愚蠢,但我真诚地感谢一些示例代码的详细帮助)

我对编程非常陌生,尤其是对 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 就没有任何意义,所以基本上如果有人可以在以下方面帮助我

  1. 使用绑定加载我的用户控件列表(我认为使用的术语是可观察的集合,但我在这里可能完全错了)

  2. 将此用户控件列表加载为 ListBox,或直接在我的面板中,或通过 ItemsControl,以最首选的方式为准

  3. 请注意,用户控件的数据上下文应该是用户控件本身,因为我在用户控件中填充的其他数据仅使用在 people_tile 用户控件的初始化子中定义的 Datacontext = Me 语句。

  4. 最后,用户控件上有一个单击事件,它在代码中单独执行了很多操作。我们也需要保留这一点。我的意思是,如果我们使用 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。感谢所有的支持。

4

1 回答 1

0

我能够自己解决它,而无需使用任何 MVVM。感谢所有的支持。

我刚刚弄清楚克莱门斯想告诉我什么。

感谢克莱门斯的所有指导。真的很感激。

于 2021-06-20T10:55:29.683 回答