前言
我创建了两个不同的数据 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>
请注意,由 DataTemplate Selector 选择的更复杂的控件可以完美地工作,因为我在没有 DataTemplateSelector 的情况下对其进行了测试。另外,关于 Binding Intervals[0].Self - self 是一个返回“this”的属性,这是我绑定到的对象的引用,唯一的原因是(当 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}"/>
显然我有 MyTemplateSelector 类覆盖 SelectTemplate 并且工作得很好......