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

WPF实现DataRowTemplate内无限嵌套DataGrid遇显示异常求助

问题:实现DataGrid无限嵌套时运行异常求助

我希望在DataRowTemplate中实现无限嵌套的DataGrid,点击某一行时能显示下一级DataGrid,以此类推。我的主类是继承自BaseViewModel的CustomTable,该类提供PropertyChanged事件用于更新视图。以下是我的C#代码和XAML代码,但运行后显示异常(见附图),参考相关资料后仍无法排查问题,特此求助。

C#代码

public class CustomTable : BaseViewModel
{
private ObservableCollection<DataTable> _main;
public ObservableCollection<DataTable> Main
{
  get
  {
    return _main;
  }
  set
  {
    _main = value;
    RaisePropertyChanged();
  }
}


private CustomTable _child;
public CustomTable Child
{
  get
  {
    return _child;
  }
  set
  {
    _child = value;
    RaisePropertyChanged();
  }
}


private DataRowView _selectedItem;
public DataRowView SelectedItem
{
  get
  {
    return _selectedItem;
  }
  set
  {
    _selectedItem = value;
    Child = new CustomTable();
    RaisePropertyChanged();
  }
}


private ContentControl _tableCollection;
public ContentControl TableCollection
{
  get
  {
    return _tableCollection;
  }
  set
  {
    _tableCollection = value;
    RaisePropertyChanged();
  }
}


public CustomTable()
{
  Main = new ObservableCollection<DataTable>();
  Main.Add(someRandomTable());
  
  TableCollection = new ContentControl();
  TableCollection.Content = Main;
}

private DataTable someRandomTable()
{
  DataTable table = new DataTable();
  table.Columns.Add("Dosage", typeof(int));
  table.Columns.Add("Drug", typeof(string));
  table.Columns.Add("Patient", typeof(string));
  table.Columns.Add("Date", typeof(DateTime));
  table.Rows.Add(25, "Indocin", "David", DateTime.Now);
  table.Rows.Add(50, "Enebrel", "Sam", DateTime.Now);
  table.Rows.Add(10, "Hydralazine", "Christoff", DateTime.Now);
  table.Rows.Add(21, "Combivent", "Janet", DateTime.Now);
  table.Rows.Add(100, "Dilantin", "Melanie", DateTime.Now);
  table.Rows.Add(53, "ACC", "Foobar", DateTime.Now);
  return table;
}
}

XAML代码

<Window.DataContext>
  <local:CustomTable/>
</Window.DataContext>

<Window.Resources> 
  <DataTemplate x:Key="Nested">
    <ItemsControl ItemsSource="{Binding DataContext.Tables, RelativeSource={RelativeSource AncestorType=DataGrid, Mode=FindAncestor}}">
      <ItemsControl.ItemTemplate>
        <DataTemplate>
          <DataGrid CanUserAddRows="False" RowDetailsTemplate="{DynamicResource Nested}" ItemsSource="{Binding Main}" AutoGenerateColumns="True" >
          </DataGrid>
        </DataTemplate>
      </ItemsControl.ItemTemplate>
    </ItemsControl>
  </DataTemplate>
</Window.Resources>

<ScrollViewer>
  <ScrollViewer.Resources>
    <DataTemplate DataType="{x:Type local:CustomTable}">
      <StackPanel>
        <ItemsControl ItemsSource="{Binding Path=Main}">
          <ItemsControl.ItemTemplate>
            <DataTemplate>
              <DataGrid SelectedItem="{Binding SelectedItem, Mode=TwoWay, RelativeSource={RelativeSource FindAncestor,AncestorType=ItemsControl}}"
                                  CanUserAddRows="False"  ItemsSource="{Binding}" AutoGenerateColumns="True" />
            </DataTemplate>
          </ItemsControl.ItemTemplate>
        </ItemsControl>
        <Expander Header="Child" Margin="10" IsExpanded="True" x:Name="child">
          <ContentControl Content="{Binding Child}"/>
        </Expander>
      </StackPanel>
      <DataTemplate.Triggers>
       <DataTrigger Binding="{Binding Child}" Value="{x:Null}">
          <Setter TargetName="child" Property="Visibility" Value="Collapsed"/>
        </DataTrigger>
      </DataTemplate.Triggers>
    </DataTemplate>
  </ScrollViewer.Resources>

  <ContentControl Content="{Binding TableCollection}"/>

</ScrollViewer>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 08:35:01