使用DataTemplate时,网格不会填充可用空间

4

我有一个ActiPro主题化的DataGrid(继承自WPF DataGrid)。 我正在使用Grid设置标题DataTemplate,但它没有占用所有可用空间。 这是我的DataTemplate:

    <DataTemplate x:Key="MyKey" DataType="ViewModels:FieldVM">
        <Border BorderThickness="1" BorderBrush="Red">
            <Grid VerticalAlignment="Stretch" >
                <Grid.RowDefinitions>
                    <RowDefinition/>
                    <RowDefinition/>
                </Grid.RowDefinitions>
                <TextBlock Text="{Binding Label}" DockPanel.Dock="Top" HorizontalAlignment="Center" Grid.Row="0"/>
                <Border Grid.Row="1" BorderBrush="Black" BorderThickness="1,0,0,0" Background="{x:Null}" />
                <local:MyUserControl Name="units" VerticalAlignment="Bottom" DockPanel.Dock="Bottom" Visibility="Visible" Grid.Row="1"/>
        </Grid>
        </Border>
        <DataTemplate.Triggers>
            <DataTrigger Binding="{Binding AvailableUnits}" Value="{x:Null}" >
                <Setter Property="Visibility" Value="Collapsed" TargetName="units" />
            </DataTrigger>
            <DataTrigger Binding="{Binding Path=IsUnitAware, RelativeSource={RelativeSource AncestorType={x:Type local:UnitConversionGrid}}}" Value="False" >
                <Setter Property="Visibility" Value="Collapsed" TargetName="units" />
            </DataTrigger>
        </DataTemplate.Triggers>
    </DataTemplate>

我希望网格使用所有可用空间,以便在DataGrid的所有列中看起来均匀。

如何使DataTemplate中的网格占用每个列标题内的所有可用空间? 我希望所有列中的行使用相同的高度。 例如,如果第一列的行高为30和70,则我希望所有其他列具有相同的分配。

示例:

---------------------------------
| Row1 with  |Row1       | Row1  |
| More Text  |           |       |
|---------------------------------
| Row2 with  |Row2       |Row2   |
| More Text  |           |       |
----------------------------------

如何让行跨列占据更高的行的高度?

谢谢!

另一个简化的例子:

<Window x:Class="DataGridTest.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:controls="clr-namespace:ActiproSoftware.Windows.Controls.DataGrid;assembly=ActiproSoftware.DataGrid.Contrib.Wpf"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition/>
            <RowDefinition Height="30"/>
        </Grid.RowDefinitions>
        <controls:ThemedDataGrid x:Name="dataGrid" Grid.Row="0" Margin="0,0,10,0" VerticalAlignment="Top" RenderTransformOrigin="-10.556,-1.744" HorizontalAlignment="Right" Width="507" Height="310">
            <DataGrid.Columns>
                <DataGridCheckBoxColumn Width="50">
                    <DataGridCheckBoxColumn.Header>
                        <Grid VerticalAlignment="Stretch" Height="{Binding RelativeSource={RelativeSource AncestorType={x:Type DataGridColumnHeader}}, Path=Height}">
                            <Grid.RowDefinitions>
                                <RowDefinition Height="*"/>
                                <RowDefinition Height="*"/>
                            </Grid.RowDefinitions>
                            <TextBlock TextWrapping="Wrap" Width="40" DockPanel.Dock="Top">Value1 Test</TextBlock>
                            <ComboBox Grid.Row="1" Visibility="Collapsed"/>
                        </Grid>
                    </DataGridCheckBoxColumn.Header>
                </DataGridCheckBoxColumn>
                <DataGridCheckBoxColumn>
                    <DataGridCheckBoxColumn.Header>
                        <Grid VerticalAlignment="Stretch">
                            <Grid.RowDefinitions>
                                <RowDefinition Height="*"/>
                                <RowDefinition Height="*"/>
                            </Grid.RowDefinitions>
                            <TextBlock TextWrapping="Wrap" Width="50">Value2 Test With Four Lines</TextBlock>
                            <ComboBox Grid.Row="1"/>
                        </Grid>
                    </DataGridCheckBoxColumn.Header>
                </DataGridCheckBoxColumn>
                <DataGridCheckBoxColumn>
                    <DataGridCheckBoxColumn.Header>
                        <Grid VerticalAlignment="Stretch">
                            <Grid.RowDefinitions>
                                <RowDefinition Height="*"/>
                                <RowDefinition Height="*"/>
                            </Grid.RowDefinitions>
                            <TextBlock Text="Value3" HorizontalAlignment="Center" DockPanel.Dock="Top" Grid.Row="0"/>
                            <ComboBox  VerticalAlignment="Bottom"  Grid.Row="1" Margin="0,1"/>
                        </Grid>
                    </DataGridCheckBoxColumn.Header>
                </DataGridCheckBoxColumn>
            </DataGrid.Columns>
        </controls:ThemedDataGrid>
    </Grid>
</Window>

可能通过更改或删除共享大小组 A 来实现,完全删除它,它们将会拉伸到整个容器。 - eran otzap
@Blam 第二行是一个用户控件,而不是标准的WPF组合框。 - dannygim
不知道我在哪里说到了组合框。你有列,但行甚至都没有对齐。你能发一张图片吗? - paparazzo
@Rhyous 是的,我尝试使用 DockPanel,结果得到了相同的行为。 - dannygim
我已经添加了一个简化的示例以更好地看到问题。如果您没有ActiPro,您可以轻松地将ThemedDataGrid替换为DataGrid。 - dannygim
显示剩余2条评论
1个回答

0
首先,请确保您的DataGrid的大小与您想象的一样大(标题可能实际上已经正确填充)。
接下来,尝试将Grid的宽度属性绑定到DataGrid的宽度,类似于以下内容:
   Width="{Binding RelativeSource="{RelativeSource FindAncestor, AncestorType={x:Type DataGrid}}" Path="ActualWidth"}"

你可能需要对保持边框元素执行相同的操作。

你的XAML还包含一些DockPanel属性,这似乎与没有DockPanel容器不符。这不应该破坏任何东西,但你可能想要将其删除。


我认为你的方向是正确的,但这会使得Header占据整个DataGrid的高度(我从你的回复中替换了宽度),因此我的DataGrid只显示Header。我尝试使用DataGridColumnHeader作为AncestorType,但得到了相同的行为。应该选择哪个AncestorType? - dannygim
我添加了一个简化示例以更好地看到问题。如果您没有ActiPro,可以轻松地将ThemedDataGrid替换为DataGrid。 - dannygim
只是为了明确,您的新示例中,问题是“较短”标题上的文本不在顶部吗?还是它不能跨越网格空间?其他所有内容看起来都像您的图片。 - BradleyDotNET
在调试过程中,我浏览了 VisualTree 并注意到我的标题中的 Grid(在我的 xaml 中)是在一个 VerticalAlignment 设置为“Center”的 ContenPresenter 中创建的。有没有办法通过 XAML 更改它? - dannygim
当然,如果您不经常更改它们,您也可以手动设置每个标题的行高。 - BradleyDotNET
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接