我正在开发一个具有分层可选树和视图的视图。 ItemsControl
绑定到一组图表。这些图表在运行时根据用户选择进行解析。我希望图表能够垂直拉伸。分享所有可用空间。
我使用Rachel Lim's class在运行时使用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>
我现在想在所述网格的每一行中添加GridSplitter
。在添加行定义的网格助手类中,我尝试添加GridSplitter
但是当尝试操纵grid.Children
集合时,它会抛出InvalidOperationException - 无法显式修改用作ItemsPanel的Panel的Children集合对于ItemsControl。 ItemsControl为Panel生成子元素。
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);
}
}
我假设在这种情况下使用ItemsControl
存在问题。这里有更好的模式吗?将自定义网格写为独立用户控件可能吗?