【问题标题】:WPF DataGrid Vertical Scroll Bar Issues with Dynamically Loaded Item Source动态加载项源的 WPF DataGrid 垂直滚动条问题
【发布时间】:2018-07-14 21:12:05
【问题描述】:

问题:除非我在网格上设置静态高度,否则无法显示 DataGrid 的垂直滚动条。我知道以前也有人问过类似的问题,但是与其他问题不同,我的示例在没有网格列的情况下要简单得多。 DataGrid 只是在控件内的 StackPanel 内。就是这样,除了设置静态高度之外,Auto、“*”等的组合都不起作用。

这仅仅是 WPF 框架中缺少的一个功能,即它是绑定到网格的 ViewModel 上的可观察集合,当项目添加到 VM 集合时不会通知视图?我是否必须编写自定义属性并将 DataGrid Height 绑定到该属性?

这是我的 XMAL:

<Window x:Class="Monster.Configure"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:viewModels="clr-namespace:Monster.ViewModels"
        xmlns:local="clr-namespace:Monster"
        mc:Ignorable="d"
        Title="Configure" Width="1200">
    <Window.DataContext>
        <viewModels:ViewModelMain/>
    </Window.DataContext>
    <Window.Resources>
        <BooleanToVisibilityConverter x:Key="b2v" />
    </Window.Resources>
    <Grid>
        <StackPanel Margin="5">

            <Button Name="button_Refresh" Content="Save / Refresh" HorizontalAlignment="Left" Margin="5" Width="100"
                    Click="button_Refresh_Click"></Button>
            <StackPanel Orientation="Horizontal">
                <!--Buttons and other junk here-->
            </StackPanel>
            <Label></Label>

                <DataGrid Name="dataGrid_PendingCreation" CanUserAddRows="True" CanUserDeleteRows="True" AutoGenerateColumns="False"
                        ItemsSource="{Binding URLsForGrid}" 
                        Loaded="dataGrid_PendingCreation_Loaded"
                        CellEditEnding="dataGrid_PendingCreation_CellEditEnding"
                        ScrollViewer.CanContentScroll="True"
                        ScrollViewer.VerticalScrollBarVisibility="Auto"
                        ScrollViewer.HorizontalScrollBarVisibility ="Auto"
                        Width="Auto" Height="Auto">

                    <DataGrid.Columns>

                    <!--Columns and junk here-->

                    </DataGrid.Columns>
                </DataGrid>


        </StackPanel>
    </Grid>
</Window>

如您所见,允许用户添加新行。这样做时,除非在 DataGrid 中设置了静态高度,否则永远不会显示垂直滚动条。

【问题讨论】:

    标签: c# wpf


    【解决方案1】:

    您的DataGrid 被包裹在StackPanel 中(垂直方向)。垂直方向的StackPanel 总是为其子级提供看似无限的可用高度。由于您的DataGridHeight 属性设置为Auto,它将尽可能地增长;它永远不会显示垂直滚动条,因为只有当DataGrid 的可用高度(由父级确定)小于实际需要的高度时才会这样做。

    解决方案是不要在这里使用StackPanel。相反,请使用GridDockPanel。 我通常更喜欢后者,如果我想要实现的只是垂直或水平堆叠孩子,并让一个孩子尽可能地伸展;这是如何完成的:

    <Window>
        ...
        <Grid>
            ...
            <DockPanel Margin="5">
                <Button DockPanel.Dock="Top" Name="button_Refresh" ... />
                <StackPanel  DockPanel.Dock="Top" Orientation="Horizontal">
                    <!--Buttons and other junk here-->
                </StackPanel>
                <Label DockPanel.Dock="Top"></Label>
                <DataGrid Name="dataGrid_PendingCreation" ... />
            </DockPanel>
            ...
        </Grid>
        ...
    </Window>
    

    确保 DataGrid 是 DockPanel 中的最后一个子元素,并且它没有 DockPanel.Dock 属性。这确保了DataGrid 将获得放置所有其他控件后剩余的可用高度和宽度。

    【讨论】:

      猜你喜欢
      • 2015-07-01
      • 1970-01-01
      • 2012-12-05
      • 2018-12-16
      • 2017-05-06
      • 1970-01-01
      • 2021-04-05
      • 2010-11-29
      • 1970-01-01
      相关资源
      最近更新 更多