如何为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
相关产品推荐
相关产品推荐

