WPF DataGrid 组嵌套列表

WPF DataGrid group nested list

我有一个任务列表,其中有一个嵌套的任务列表。 现在我想使用 MVVM 模式在 WPF DataGrid 中显示此列表。 “外部”任务的任务名称应为组的标题,所有嵌套任务应显示在下方。

结果应该是这样的: Example

public class ProjectTask
{
    public Guid TaskUID { get; set; }
    public string TaskName { get; set; }
    public DateTime TaskStartDate { get; set; }
    public DateTime TaskFinishDate { get; set; }

    public List<ProjectTask> SubTasks { get; set; } = new();
}

public List<ProjectTask> ProjectTasks
{
    get { return projectTasks; }
    set { projectTasks = value; OnPropertyChanged(); }
}

到目前为止我尝试的是创建一个 CollectionViewSource

 <CollectionViewSource x:Key="GroupedTaskList" Source="{Binding ProjectTasks}">
            <CollectionViewSource.GroupDescriptions>
                <PropertyGroupDescription PropertyName="SubTasks" />
            </CollectionViewSource.GroupDescriptions>
        </CollectionViewSource>

并将其绑定到 DataGrid

<DataGrid AutoGenerateColumns="False" IsReadOnly="True"
        ItemsSource="{Binding Source={StaticResource GroupedTaskList}}"
          >
    <DataGrid.Columns>
        <DataGridTextColumn Width="*" Header="Name" Binding="{Binding Path=TaskName}" />
        <DataGridTextColumn Header="Start" Binding="{Binding Path=TaskStartDate, StringFormat=d}" />
        <DataGridTextColumn Header="End" Binding="{Binding Path=TaskFinishDate, StringFormat=d}" />
    </DataGrid.Columns>
</DataGrid>

但是如何对任务进行分组?

        <DataGrid.Columns>
            <DataGridTextColumn Header="" AutomationProperties.Name="" IsReadOnly="True" Binding="{Binding Path=TaskName}"/>
            <DataGridTextColumn Header="" AutomationProperties.Name="" IsReadOnly="True" Binding="{Binding Path=TaskStartDate, StringFormat=d}"/>
            <DataGridTextColumn Header="" AutomationProperties.Name="" IsReadOnly="True" Binding="{Binding Path=TaskEndDate, StringFormat=d}"/>
            <DataGridTemplateColumn Header="Sub Tasks" AutomationProperties.Name="">
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <ListView ItemsSource="{Binding SubTaskList}">
                            <ListView.ItemTemplate>
                                <DataTemplate>
                                    <TextBlock Text="{Binding SubTask}"/>
                                </DataTemplate>
                            </ListView.ItemTemplate>
                        </ListView>
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>
        </DataGrid.Columns>

我能够使用这样的模板列实现它,希望这对您有所帮助。


更好地理解问题后编辑

    <DataGrid ItemsSource="{Binding Tasks}" AutoGenerateColumns="false"
          RowDetailsVisibilityMode="Visible"
          CanUserAddRows="False" >
        <DataGrid.Columns>
            <DataGridTextColumn Header="Task Name" Binding="{Binding TaskName}"/>
            <DataGridTextColumn Header="Task Start Date" Binding="{Binding TaskStartDate}"/>
            <DataGridTextColumn Header="Task End Date" Binding="{Binding TaskStartDate}"/>
        </DataGrid.Columns>
        <DataGrid.RowDetailsTemplate>
            <DataTemplate>
                <DataGrid ItemsSource="{Binding SubTasks}" AutoGenerateColumns="false" CanUserAddRows="False">
                    <DataGrid.Columns>
                        <DataGridTextColumn Header="Sub Task Name" Binding="{Binding TaskName}"/>
                        <DataGridTextColumn Header="Sub Task Start Date" Binding="{Binding TaskStartDate}"/>
                        <DataGridTextColumn Header="Sub Task End Date" Binding="{Binding TaskStartDate}"/>
                    </DataGrid.Columns>
                </DataGrid>
            </DataTemplate>
        </DataGrid.RowDetailsTemplate>
    </DataGrid>

快速浏览一下它的作用https://imgur.com/OIc9uCr