如何在WPF DataGrid的RowDetailsTemplate行详情模板中嵌套DataGrid
问题原因
WrapPanel 内的控件可以直接继承当前行的 DataContext 绑定单个属性,而 DataGrid 是列表类控件,必须指定 ItemsSource 集合数据源才会生成行渲染内容,你当前的嵌套 DataGrid 没有配置数据源,所以无法显示内容。
解决方案
你需要给嵌套的 DataGrid 绑定一个仅包含当前行数据的单元素集合,有两种常用实现方式:
方案1:修改实体类(改动最小)
给你的 TableData 类新增一个返回自身单元素集合的属性:
public class TableData : INotifyPropertyChanged { // 原有属性保持不变 // 新增以下属性即可 public List<TableData> SelfList => new List<TableData> { this }; }
然后修改嵌套DataGrid的XAML,指定ItemsSource绑定该属性:
<DataGrid x:Name="RowDetailsDataGrid" AutoGenerateColumns="False" ItemsSource="{Binding SelfList}"> <!-- 原有列定义保持不变 --> </DataGrid>
方案2:使用值转换器(无需修改实体类)
如果不想改动实体类结构,可以定义一个值转换器把单个对象转为单元素集合:
- 新增转换器类:
using System; using System.Collections.Generic; using System.Globalization; using System.Windows.Data; public class ObjectToSingleListConverter : IValueConverter { public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { return value == null ? new List<object>() : new List<object> { value }; } public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) { throw new NotImplementedException(); } }
- 在窗口资源中注册转换器:
<Window.Resources> <local:ObjectToSingleListConverter x:Key="ObjectToSingleListConverter"/> </Window.Resources>
- 修改嵌套DataGrid的绑定配置:
<DataGrid x:Name="RowDetailsDataGrid" AutoGenerateColumns="False" ItemsSource="{Binding Converter={StaticResource ObjectToSingleListConverter}}"> <!-- 原有列定义保持不变 --> </DataGrid>
两种方案都可以实现单行DataGrid的展示需求,选择任意一种即可。
内容的提问来源于stack exchange,提问作者afham Mk
相关产品推荐
相关产品推荐

