前言
我创建了两个不同的数据DataTemplates,以便更快地加载数据网格单元.一个基本上是文本块,另一个是更昂贵的UserControl.在加载时,数据模板选择器决定是否需要加载廉价和更昂贵的控件,这会将首次加载/性能从~12秒提高到~2,因为大多数单元不需要复杂且加载简单模板所需的时间与其他模板相比几乎没有.
无论如何,它在负载上运行良好.但是,当我更改下面的数据时,会引发属性更改,并且应该强制DataTemplateSelector再次调用SelectTemplate()来重新评估要使用的数据模板 - 嗯,它不会.
有趣的是,在上面的失败之后,当我点击一个单元格时,它会调用SelectTemplate()并在需要时翻转DataTemplate.
码
<DataGrid>
.....
<DataGridTemplateColumn>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ContentControl Content="{Binding Intervals[0].Self}"
ContentTemplateSelector="{StaticResource TxtVsExpensiveCell_TemplateSelector}"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
Run Code Online (Sandbox Code Playgroud)
请注意,DataTemplate选择器选择的更复杂的控件与我在没有DataTemplateSelector的情况下测试时的工作方式完美相同.另外,关于Binding Intervals [0]的注释.自我是一个返回"this"的属性,我绑定的Object的ref,唯一的原因是(当Self被提升时)到强制重新评估DataTemplate.显然这不太奏效.
题
如何强制数据模板重新评估?
支持代码*
这是我的资源词典(没什么特别的)
<DataTemplate x:Key="SimpleTemplate">
<TextBlock DataContext="{Binding}"/>
</DataTemplate>
<DataTemplate x:Key="ComplexTemplate">
<Views:ComplexCell DataContext="{Binding}"/>
</DataTemplate>
<Views:MyTemplateSelector
x:Key="TxtVsExpensiveCell_TemplateSelector"
SimpleTemplate="{StaticResource SimpleTemplate}"
ComplexTemplate="{StaticResource ComplexTemplate}"/>
Run Code Online (Sandbox Code Playgroud)
显然我有MyTemplateSelector类覆盖SelectTemplate并且工作得很好......