如何在WPF DataGrid模板列中添加动态自定义单元格?
解决方案
1. 修改XAML中的Traits列模板
用ItemsControl绑定Traits集合,自动生成每个Trait对应的TextBlock,替代原来的硬编码写法:
<DataGrid x:Name="creatureDatagrid"> <DataGrid.Columns> <!-- 其他列保持不变 --> <DataGridTemplateColumn Header="Traits"> <DataGridTemplateColumn.CellTemplate> <DataTemplate> <!-- 通过ItemsControl自动遍历Traits集合生成元素 --> <ItemsControl ItemsSource="{Binding Traits, FallbackValue={x:Static sys:String.Empty}}"> <!-- 指定子元素使用横向布局 --> <ItemsControl.ItemsPanel> <ItemsPanelTemplate> <StackPanel Orientation="Horizontal" /> </ItemsPanelTemplate> </ItemsControl.ItemsPanel> <!-- 定义单个Trait的显示样式 --> <ItemsControl.ItemTemplate> <DataTemplate> <TextBlock Text="{Binding Name}" ToolTip="{Binding Value}" Margin="2,0" /> </DataTemplate> </ItemsControl.ItemTemplate> </ItemsControl> </DataTemplate> </DataGridTemplateColumn.CellTemplate> </DataGridTemplateColumn> <!-- 其他列保持不变 --> </DataGrid.Columns> </DataGrid>
注意:需要在XAML根节点(比如Window标签)添加系统命名空间,用于FallbackValue的空值处理:
xmlns:sys="clr-namespace:System;assembly=mscorlib"
2. 优化数据集合(可选但推荐)
如果需要Traits集合动态增减时UI自动更新,把Monster类中的List<NameValuePair>替换为ObservableCollection<NameValuePair>:
public class Monster { // 其他属性保持不变 public ObservableCollection<NameValuePair> Traits { get; set; } = new ObservableCollection<NameValuePair>(); }
ObservableCollection会自动通知UI集合的变化,比普通List更适配WPF的绑定机制。
3. 处理Player类的Traits属性(按需)
如果Player类没有Traits属性,可添加一个空集合属性避免绑定报错:
public class Player { // 其他属性保持不变 public IEnumerable<NameValuePair> Traits => Enumerable.Empty<NameValuePair>(); }
内容的提问来源于stack exchange,提问作者NoTimeLeft
相关产品推荐
相关产品推荐

