C# 向动态创建的网格行添加GridSplitter?

C# 向动态创建的网格行添加GridSplitter?,c#,wpf,xaml,wpf-controls,C#,Wpf,Xaml,Wpf Controls,我正在开发一个视图,它有一个分层的可选择树&ItemsControl绑定到一组图表。这些图表在运行时根据用户选择进行解析。我希望图表垂直拉伸并共享所有可用空间 我曾经使用ItemsControl ItemsPanelTemplate中的附加属性在运行时动态解析网格中的行。这将按预期工作,图表共享可用空间 <ItemsControl Grid.Row="1" x:Name="TimeSeriesCharting"

我正在开发一个视图,它有一个分层的可选择树&
ItemsControl
绑定到一组图表。这些图表在运行时根据用户选择进行解析。我希望图表垂直拉伸并共享所有可用空间

我曾经使用ItemsControl ItemsPanelTemplate中的附加属性在运行时动态解析网格中的行。这将按预期工作,图表共享可用空间

 <ItemsControl Grid.Row="1"  
      x:Name="TimeSeriesCharting"                                                                                          
          ItemsSource="{Binding TimeSeriesChartViewModels}">
                    <ItemsControl.ItemsPanel>
                        <ItemsPanelTemplate>
                            <Grid helpers:GridHelpers.RowCount="{Binding RowCount}"
                                  helpers:GridHelpers.StarRows="0,1,2,3">
                            </Grid>
                        </ItemsPanelTemplate>
                    </ItemsControl.ItemsPanel>

                    <!-- ItemContainerStyle -->
                    <ItemsControl.ItemContainerStyle>
                        <Style>
                <Setter Property="Grid.Row" Value="{Binding RowIndex}"/>
             </Style>
         </ItemsControl.ItemContainerStyle>                        
 </ItemsControl>

我假设在这种情况下使用
ItemsControl
会出现问题。这里有更好的模式吗?将自定义网格作为独立用户控件写入?

您可以尝试将GridSplitter放入ItemTemplate?:我无法显式设置项上的grid.Row属性,因为在运行时之前我不会解析行。我尝试将GridSplitter放在项目本身中,它是一个视图。这对该视图有效,但显然对所有其他视图无效,因此它们不会调整大小…下面是一个现有的答案,提示可能的方向:。我也在探索这一点。
   public static void RowCountChanged(DependencyObject obj, DependencyPropertyChangedEventArgs e)
    {
      if (!(obj is Grid) || (int)e.NewValue < 0)
      {
        return;
      }

      Grid grid = (Grid)obj;
      grid.RowDefinitions.Clear();

      for (int i = 0; i < (int)e.NewValue; i++)
       {
         grid.RowDefinitions.Add(new RowDefinition()
          {
            Height = GridLength.Auto
          });

          SetStarRows(grid);
         }

            grid.Children.Clear();

            for (int i = 0; i < grid.RowDefinitions.Count; i++)
            {
                GridSplitter gridSplitter = new GridSplitter();
                gridSplitter.SetResourceReference(FrameworkElement.StyleProperty, "HorizontalGridSplitterStyle");
                Grid.SetRow(gridSplitter, i);
                grid.Children.Add(gridSplitter);
            }        
        }