You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为WinUI DataGrid使用TemplateSelector实现单元格模板切换

在WinUI DataGridTemplateColumn中应用DataTemplateSelector动态切换单元格模板

核心解决方案

要在DataGridTemplateColumn中正确应用CarTemplateSelector,需在单元格模板内使用ContentPresenter,将其Content绑定到当前的CarViewModel实例,同时指定ContentTemplateSelector为你定义的选择器资源,确保模板选择器能拿到正确的数据项进行判断。

修正后的完整XAML代码

替换你原来的DataGridTemplateColumn.CellTemplate部分,代码如下:

<controls:DataGrid ItemsSource="{x:Bind Items}">
    <controls:DataGrid.Columns>
        <controls:DataGridTemplateColumn Header="Name" Width="324">
            <controls:DataGridTemplateColumn.CellTemplate>
                <DataTemplate x:DataType="viewmodels:CarViewModel">
                    <!-- 关键:绑定当前数据项到Content,指定模板选择器 -->
                    <ContentPresenter 
                        Content="{Binding}" 
                        ContentTemplateSelector="{StaticResource CarTemplateSelector}" />
                </DataTemplate>
            </controls:DataGridTemplateColumn.CellTemplate>
        </controls:DataGridTemplateColumn>
    </controls:DataGrid.Columns>
</controls:DataGrid>

问题原因说明

你之前使用ContentPresenter却无法获取CarViewModel实例,是因为未设置Content属性。ContentPresenter默认Content为空,导致模板选择器的SelectTemplate方法中item参数不是CarViewModel对象,无法进行判断。通过Content="{Binding}"将当前单元格的数据上下文(即集合中的CarViewModel实例)传递给ContentPresenter,模板选择器就能正常工作。

额外提示:动态更新模板

如果需要在IsElectric属性变化时自动切换模板,默认的DataTemplateSelector不会自动响应属性变更,可通过以下方式实现:

  • 给ContentPresenter添加DataTrigger,监听IsElectric属性变化并手动切换ContentTemplate
  • 自定义支持属性变更通知的模板选择器,在PropertyChanged事件触发时重新选择模板

内容的提问来源于stack exchange,提问作者Patrik Valyon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 12:41:02