2013-02-20 116 views
0

这是一个更一般的问题... 我有一个用户控件,我写了(用户控件,而不是自定义控件)。我使用的一个的DataGridColumn此控件提供查找functionality..much这样的:每次datacontext更改时都会创建一个自定义usercontrol?

   <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这是问题。因为我的控件用于数据网格中,每当网格的项目源发生更改时,它是否会销毁并重新创建控件?我可以看到它在这么做..但不知道这是我所看到的原因。假设它是...是否有一种方法可以让datagrid重用usercontrol实例,而不是在datagrid的项目源更改时创建新实例?

回答

0

看起来,usercontrols用作datagrid的DataTemplate列的原因会在数据网格的项目源发生更改时被销毁并重新创建。在我的情况下,解决方案是使用正常的网格,因为我的列表中始终有4个项目用作网格的项目源。这不是理想的,也不是N-item列表的解决方案..但在我的情况下,它大大提高了性能,因为我的用户控件在初始化时执行了一些密集的数据库查找以缓存数据。

+0

从数据库获取数据并缓存它不是视图的责任。这看起来像通常在winforms中发现的那种黑客。如果你有一个合适的架构,你就不需要诉诸这个了,因为usercontrols在创建时实际上不需要做任何事情。 – 2013-02-21 01:03:33

+0

helpful..blame从5行xaml的建筑。该控件允许消费者通过适配器/提供商提供数据。它使用分层模板将这些数据分组到最多4层。考虑到数据的大小,它相当高效。控制不是问题。它是使用这些控件的模板。当用户从主列表中选择时,数据网格的itemssource会发生变化。因为ctl是数据网格的模板列,所以它被重新创建。那就是问题所在。你有解决方案吗?或只是从5行xaml的广泛批评? – mike01010 2013-02-21 01:58:34

+0

我不介意在用户控件中构建一个完整的Explorer.exe Windows shell,但是,从数据库获取数据并缓存它不是视图的责任。曾听说过[关注分离](http://en.wikipedia.org/wiki/Separation_of_concerns)?它是一个相当新的概念,所以我明白如果你以前从来没有听说过它。它自1975年以来一直存在或其他事情。 – 2013-02-21 02:07:34

相关问题