动态加载项目源的WPF DataGrid垂直滚动条问题

时间:2018-07-14 21:12:05

标签: c# wpf

问题:除非我在网格上设置了静态高度,否则无法使DataGrid的垂直滚动条出现。我知道之前曾问过类似的问题,但是与其他问题不同,我的示例更加简单,没有网格列。 DataGrid只是在控件内部的StackPanel内部。就是这样,除非设置了静态高度,否则自动,“ *”等自动组合功能均无效。

这是否仅仅是WPF框架中缺少的功能,即它是绑定到网格的ViewModel上的Observable集合,在将项添加到VM集合时不会通知View?我是否必须编写自定义属性并将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中设置了“静态高度”,否则垂直滚动条将永远不会显示。

1 个答案:

答案 0 :(得分:1)

您的DataGrid包裹在StackPanel内(垂直放置)。垂直放置的StackPanel总是给子级提供看似无限的可用高度。由于您的DataGrid的{​​{1}}属性设置为Height,因此它将尽可能地大。它永远不会显示垂直滚动条,因为只有当Auto的可用高度(由父级确定)小于实际所需的高度时,此操作才会完成。

解决方案是不要在此处使用DataGrid。而是使用StackPanelGrid。 如果我要实现的是垂直或水平堆叠孩子,并且让一个孩子尽可能宽地伸展,我通常更喜欢后者。这是完成的方式:

DockPanel

确保<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> 是DockPanel中的最后一个孩子,并且没有DataGrid属性。这样可以确保在放置所有其他控件后,DockPanel.Dock会保持可用的高度和宽度。