【问题标题】:How to extend height of DataGrid based on the height of another?如何根据另一个高度扩展 DataGrid 的高度?
【发布时间】:2013-08-05 18:57:58
【问题描述】:

我希望能够在 DataGrid 的基础上拥有两个相同高度的 DataGrids,它们拥有更多数据并因此变得更高。换句话说,我想让两个DataGrids 的高度相同,无论数据输入如何。我有一行和几列,其中一个 DataGrid 占用一列,另一个 DataGrid 占用另一列。以防万一,DataGrid 之一获得更多输入,然后延伸得更高。我希望另一个DataGrid 与下面的空白空间相同。我想知道如何使它工作。任何DataGrid 都应该根据更高的DataGrid 的高度自动扩展。任何想法都非常感谢!

以下是示例 XAML:

<Window
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Class="DataGridExpand.MainWindow"
x:Name="Window"
Title="MainWindow"
Width="640" Height="480">

<Window.Resources>
    <XmlDataProvider x:Key="Info" XPath="Info/Values">
          <x:XData> 
            <Info xmlns="">
              <Values Name="Value1" />
              <Values Name="Value2"  />
              <Values Name="Value3" />
              <Values Name="Value4" />
              <Values Name="Value5"  />
              <Values Name="Value6"  />
              <Values Name="Value7"  />
              <Values Name="Value8"  />
              <Values Name="Value9"  />
            </Info>
          </x:XData>
    </XmlDataProvider>
    <XmlDataProvider x:Key="Info2" XPath="Info2/Values2">
          <x:XData> 
            <Info2 xmlns="">
              <Values2 Name="Value1" />
              <Values2 Name="Value2"  />
              <Values2 Name="Value3" />
              <Values2 Name="Value4" />
              <Values2 Name="Value5" />
            </Info2>
          </x:XData>
    </XmlDataProvider>
</Window.Resources>

<Grid x:Name="LayoutRoot" Margin="10" > 
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto" />
    </Grid.RowDefinitions>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="49*" />
        <ColumnDefinition Width="20" />
        <ColumnDefinition Width="49*" />
    </Grid.ColumnDefinitions>
    <Border Padding="10" BorderBrush="Black" Background="#FFD2D2D2">
        <DataGrid x:Name="Main" GridLinesVisibility="Horizontal" AutoGenerateColumns="False" 
            ItemsSource="{Binding XPath=/Info2/Values2}"
            DataContext="{Binding Source={StaticResource Info2}}" Margin="10">
            <DataGrid.Columns>
                <DataGridTextColumn Binding="{Binding XPath=@Name}" Foreground="#FF6E6E6E" Width="160" />   
            </DataGrid.Columns>
        </DataGrid>
    </Border>
    <GridSplitter x:Name="GridSplitter" ResizeBehavior="PreviousAndNext" HorizontalAlignment="Stretch" Grid.Column="1" />
    <Border Grid.Column="2" Padding="10" BorderBrush="Black" Background="#FFD2D2D2">
        <DataGrid x:Name="Main1" GridLinesVisibility="Horizontal" AutoGenerateColumns="False" Margin="10"
            ItemsSource="{Binding XPath=/Info/Values}" 
            DataContext="{Binding Source={StaticResource Info}}">
            <DataGrid.Columns>
                <DataGridTextColumn Binding="{Binding XPath=@Name}" Foreground="#FF6E6E6E" Width="160" />   
            </DataGrid.Columns>
        </DataGrid>
    </Border>
</Grid>

【问题讨论】:

标签: wpf xaml data-binding datagrid


【解决方案1】:

您可以将两个 DataGrids 放入一个 Grid 中,每行一排,使用 SharedSizeGroup 让它们同步。为两个网格的父级设置Grid.IsSharedSizeScope

例如像这样的

<Grid x:Name="LayoutRoot" Margin="10" Grid.IsSharedSizeScope="True">
    ...
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition SharedSizeGroup="A"/>
        </Grid.RowDefinitions>
        ...
        <DataGrid .../> <!-- DataGrid 1 -->
    </Grid>
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition SharedSizeGroup="A"/>
        </Grid.RowDefinitions>
        ...
        <DataGrid .../> <!-- DataGrid 2 -->
    </Grid>
    ...
</Grid>

【讨论】:

  • 感谢您的帮助。就我而言,我只能有一个网格。看起来我无法实现这种技术。有什么想法吗?
  • 我需要数据网格的高度,因为我可能在数据网格顶部的那一行中有其他元素。结果,我需要将数据网格扩展到行的底部,因为如果其他列具有更高的数据网格,它将不会像另一个数据网格一样高。两个 datgrid 的高度相同。
  • 我无法想象您的意思,图表会有所帮助。此外,您难道不应该仅通过在共享大小网格中包含/排除特定元素来处理几乎所有设置吗?
  • 如果您将我上面提供的代码复制并粘贴到 WPF 项目中,那么您将在那里找到两个数据网格。其中一个比另一个短。我需要一个较短的延伸到底部,并为空白区域留出空白空间,使其看起来与另一个高度相同。这样,两个数据网格的高度将相同。
  • 这可能比预期的要困难一些;我现在无法帮助你...
【解决方案2】:

如果我的理解正确,您需要两个DataGrids 具有完全相同的高度吗?尝试将一个DataGridMinimumHeight 设置为另一个ActualHeight,反之亦然。这可能会奏效:

<DataGrid x:Name="Main" 
    MinHeight="{Binding ElementName=Main1,Path=ActualHeight}"
    ...

<DataGrid x:Name="Main1" GridLinesVisibility="Horizontal" AutoGenerateColumns="False"
    MinHeight="{Binding ElementName=Main,Path=ActualHeight}"
    ...

【讨论】:

  • 感谢您查看我的帖子。我以不同的方式解决了这个问题。我更改了包含 datagrinds 的网格的布局,这将允许自动扩展高度。默认情况下,Datagrid 能够做到这一点。再次感谢您。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-29
  • 2021-03-31
  • 2023-03-14
相关资源
最近更新 更多