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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 13:05:21