5

序文

データグリッド セルの読み込み時間を短縮するために、2 つの異なるデータ DataTemplate を作成しました。1 つは基本的にテキストブロックで、もう 1 つはより高価な 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 が発生したとき) to DataTemplate の再評価を強制します。どうやらそれはうまくいきません。

質問

データ テンプレートを強制的に再評価するにはどうすればよいですか?

サポートコード*

これは私のリソース dict です (派手なものは何もありません)

<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}"/>

そして明らかに、SelectTemplateをオーバーライドして正常に動作するMyTemplateSelectorクラスがあります...

4

0 に答える 0