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

WPF MVVM模式下为DataGrid自动生成的DataGridTextColumn绑定ToolTip问询

实现方案

第一步:调整DataTable填充逻辑

将First列的存储类型从字符串改为ObservableCollection<SubModel>,保留后续绑定所需的完整集合数据,后续通过绑定规则控制显示内容即可:

// 修改列类型为集合类型
dataTable.Columns.Add("First", typeof(ObservableCollection<SubModel>));

foreach (Model item in modelItems)
{
    DataRow dataRow = dataTable.NewRow();
    // 直接存储完整集合,而非仅第一个元素的名称
    dataRow[0] = item.SomeValues;
    dataTable.Rows.Add(dataRow);
}

第二步:修改自动生成列的绑定规则

调整AutoGeneratingColumn事件中的列绑定路径,直接从集合中取第一个元素的Name属性用于表格常规展示:

var textColumn = new DataGridTextColumn
{
    // 绑定集合第一个元素的Name属性用于显示
    Binding = new Binding($"{e.PropertyName}[0].Name"),
    Header = e.PropertyName,
    CellStyle = (sender as FrameworkElement).FindResource("FirstColumnStyle") as Style
};
e.Column = textColumn;

第三步:修改Style中ToolTip的定义

将ToolTip设置为列表容器,绑定完整集合展示所有Name值:

<Style x:Key="FirstColumnStyle" TargetType="DataGridCell">
    <!-- 其他Setter省略 -->
    <Setter Property="ToolTip">
        <Setter.Value>
            <ItemsControl ItemsSource="{Binding First}">
                <ItemsControl.ItemTemplate>
                    <DataTemplate>
                        <TextBlock Text="{Binding Name}" Margin="2,0"/>
                    </DataTemplate>
                </ItemsControl.ItemTemplate>
            </ItemsControl>
        </Setter.Value>
    </Setter>
</Style>

补充说明

你之前对ComboBox绑定的认知存在偏差:ComboBox的ItemsSource可以绑定当前行数据上下文中的任意集合属性,并非只能绑定静态资源或全局ViewModel属性。如果后续需要用下拉列表实现同类需求,只需把DataGridTemplateColumn里的ComboBox的ItemsSource绑定到行数据上下文的First集合即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 01:36:03