5

前言

我创建了两个不同的数据 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 并且工作得很好......

4

0 回答 0