问题:除非我在网格上设置了静态高度,否则无法使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中设置了“静态高度”,否则垂直滚动条将永远不会显示。
答案 0 :(得分:1)
您的DataGrid
包裹在StackPanel
内(垂直放置)。垂直放置的StackPanel
总是给子级提供看似无限的可用高度。由于您的DataGrid
的{{1}}属性设置为Height
,因此它将尽可能地大。它永远不会显示垂直滚动条,因为只有当Auto
的可用高度(由父级确定)小于实际所需的高度时,此操作才会完成。
解决方案是不要在此处使用DataGrid
。而是使用StackPanel
或Grid
。
如果我要实现的是垂直或水平堆叠孩子,并且让一个孩子尽可能宽地伸展,我通常更喜欢后者。这是完成的方式:
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
会保持可用的高度和宽度。