C# 是否在每次datacontext更改时创建自定义usercontrol?

C# 是否在每次datacontext更改时创建自定义usercontrol?,c#,.net,wpf,xaml,C#,.net,Wpf,Xaml,这是一个更一般的问题。。。 我已经编写了一个用户控件(UserControl,而不是自定义控件)。我在DataGridColumn中使用此控件来提供查找功能..非常类似于: <DataGridTemplate ColumnHeader="Company"> <DataGridTemplateColumn.CellTemplate> <DataTemp

这是一个更一般的问题。。。 我已经编写了一个用户控件(UserControl,而不是自定义控件)。我在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的构造函数。这是预期的行为吗?为了防止这种情况?我不明白为什么有必要这样做……我认为控件的单个实例应该能够从datacontext中刷新自己


编辑:谷歌并没有提供任何明确的答案……但据我所知,可能是数据网格的问题。由于我的控件在datagrid中使用,因此每当网格的itemsource更改时,它是否会销毁并重新创建控件?我看得出这样做是有道理的,但不确定这是否就是我所看到的原因。假设是……当datagrid的itemsource更改时,是否有办法让datagrid重用usercontrol实例,而不是创建新实例?

当datagrid的itemsource更改时,用作datagrid的DataTemplate列的usercontrol的原因似乎被销毁并重新创建。在我的例子中,解决方案是使用普通网格,因为我的列表中始终有4个项目用作网格的itemsource。这不是理想的解决方案,也不是N项列表的解决方案。但在我的例子中,它大大提高了性能,因为我的usercontrol在初始化时执行了一些密集的datbase查找以缓存数据。

从数据库获取数据并缓存它不是视图的责任。这看起来像winforms中常见的黑客。如果你有一个合适的体系结构,你就不需要求助于它,因为usercontrols实际上在创建时不需要做任何事情。该控件允许使用者通过适配器/提供者提供数据。它使用分层模板呈现数据,将数据分组到4个级别。考虑到数据的大小,它在这方面相当有效。控制不是问题所在。使用这些控件的是模板。当用户从主列表中选择时,datagrid的itemssource会发生更改。因为ctl是数据网格的模板列,所以会重新创建它。这就是问题所在。你有解决办法吗?或者仅仅是来自5行xaml的广泛批评?我不在乎是否在用户控件中构建一个完整的Explorer.exe Windows shell,但是,从数据库获取数据并缓存数据不是视图的责任。听说过吗?这是一个相当新的概念,所以如果你以前从未听说过,我理解。它从1975年左右就开始了。说真的,如果你没有什么贡献的话……没必要发表评论。StackOverflow不是一个让你感觉更好的论坛,你可以通过提问来弥补自卑感。你的SOC评论不值得回复,因为你似乎仍然无法理解控件不做任何数据提取。它提供了数据…无论是来自数据库、Web服务、平面文件等。它的工作是呈现这些数据…我想也许你不应该仅仅发布链接,还应该阅读它们。