代码之家  ›  专栏  ›  技术社区  ›  mike01010

是否在每次数据上下文更改时都创建了自定义用户控件?

  •  0
  • mike01010  · 技术社区  · 13 年前

    这更像是一个一般性的问题。。。 我已经编写了一个用户控件(UserControl,而不是Custom control)。我在DataGridColumn中使用此控件来提供查找功能。。很像这样:

                    <DataGridTemplate ColumnHeader="Company">
                       <DataGridTemplateColumn.CellTemplate>
                            <DataTemplate>
                                <lookupCtl:LookUpCTL SelectedCompany="{Binding Company, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
                                               CompanyChangedCommand="{Binding DataContext.CompanyChangedCmd, RelativeSource={RelativeSource AncestorType=DataGrid}}"/>
                            </DataTemplate>
                        </DataGridTemplateColumn.CellTemplate>
                    </DataGridTemplateColumn>
    

    我注意到,每当父/包含控件的dataconext发生更改时,就会调用LookUpCTL的构造函数。这是预期的行为吗?无论如何要防止这种情况发生?因为我不明白为什么这是必要的。。。我认为,控件的单个实例应该能够从数据上下文中刷新自己。

    编辑:谷歌搜索没有提供任何明确的答案。。。但从我所读到的内容来看,问题可能出在数据网格上。由于我的控件是在数据网格中使用的,每次网格的itemsource发生变化时,它是否会销毁并重新创建控件?我这样做是有道理的,但不确定这是否是我看到的原因。假设是……当数据网格的项源发生变化时,有没有办法让数据网格重用用户控件的实例,而不是创建新的实例?

    1 回复  |  直到 13 年前
        1
  •  0
  •   mike01010    13 年前

    当数据网格的项源发生更改时,用作数据网格的DataTemplate列的用户控件被销毁并重新创建的原因似乎确实存在。在我的案例中,解决方案是使用一个普通的网格,因为我的列表中总是有4个项目用作网格的项目源。这并不理想,也不是N项列表的解决方案。。但在我的情况下,它大大提高了性能,因为我的usercontrol在初始化缓存数据时执行了一些密集的数据库查找。