Wpf DataGrid在扩展器和ItemsControl中带有ScrollViewer

Wpf DataGrid在扩展器和ItemsControl中带有ScrollViewer,wpf,xaml,datagrid,expander,Wpf,Xaml,Datagrid,Expander,我有一个ItemsControl,在一个扩展器中有一个DataGrid作为ItemTemplate <Grid> <ScrollViewer HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto"> <ItemsControl ItemsSource="{Binding SomeItemSource}">

我有一个ItemsControl,在一个扩展器中有一个DataGrid作为ItemTemplate

<Grid>
    <ScrollViewer HorizontalScrollBarVisibility="Auto"
                  VerticalScrollBarVisibility="Auto">
        <ItemsControl ItemsSource="{Binding SomeItemSource}">
            <ItemsControl.ItemTemplate>
                <DataTemplate>
                    <Expander>
                        <Grid>
                            <DataGrid ItemsSource="{Binding SomeItemSource}"
                                      ScrollViewer.CanContentScroll="True"
                                      ScrollViewer.VerticalScrollBarVisibility="Auto"
                                      ScrollViewer.HorizontalScrollBarVisibility="Auto"
                                      MaxHeight="200">
                            </DataGrid>
                        </Grid>
                    </Expander>
                </DataTemplate>
            </ItemsControl.ItemTemplate>
        </ItemsControl>
    </ScrollViewer>
</Grid>
我想为每个DataGrid提供一个ScrollViewer,如果扩展器太多,则为扩展器列表提供一个ScrollViewer。我的问题是,只有设置DataGrid的MaxHeight属性,它才能工作。这很烦人,因为如果ItemsControl中只有一个条目,则该条目不会占用整个空间,因为其高度有限


有人有什么想法吗?

嗯,很难理解你的想法,但这可能会对你的未来有所帮助

问题在于ScrollViewer。让我向您展示ScrollViewer在WPF中的功能

它的默认行为是在用户是否想要滚动条之间切换

如果用户未设置任何首选项,ScrollViewer将尝试使用滚动条。因此,ScrollViewer将无穷大作为值传递给其子对象,以允许其子对象占据任意多的空间。在您的情况下,最终的结果是,当一个项目仅存在时,它不会填满所有可用空间,因为ScrollViewer允许它以小于可用大小的所需大小排列。基本上换句话说,ScrollViewer对孩子们说,“我不在乎,你们选择你们想要的尺寸,然后按照你们想要的尺寸来安排自己。”。我将只显示滚动条,以便用户可以滚动到您。ScrollViewer相当愚蠢

为了接收满空间行为,您必须告诉ScrollViewer禁用滚动条。然后ScrollViewer不会将无穷大作为度量值传递给它的子对象,而是传递窗口/可用空间的大小。孩子们会注意到一个固定的宽度和高度是存在的,而不是无限的,他们会测量自己来填满给定的空间。意味着儿童所需的大小将是窗口大小或可用spcae的大小,而不是他们希望的大小。无论如何,他们想要的比可用空间小

总而言之。当您有一个项目时,只需禁用滚动条或根本不使用ScrollViewer。离开ScrollViewer,让Expander成为网格的下一个节点。扩展器将使用完整的可用空间。不过,当您注意到向ItemsSource添加了新项目时,您只需交换模板并使用ScrollViewer环绕展开器即可进行滚动


我希望我至少给了您一个如何使一个项目具有完整大小的想法。

如果您不通过高度属性告诉内部滚动查看器何时添加滚动条,您希望内部滚动查看器如何知道何时添加滚动条?扩张器会让它像其他东西一样变大,这就是我问的原因。我不知道怎么办,但也许有人知道。考虑一种在只有一个条目时计算MaxHeight的行为。但这可能有点尴尬。好吧,让我换个说法。。。如果您不告诉内部ScrollViewer何时通过设置Height或MaxHeight或MinHeight属性添加滚动条,则内部ScrollViewer将不知道何时添加滚动条。我理解这一点。我提到了通过行为原因计算MaxHeight,当用户调整应用程序的大小或ItemsControl中只有一个条目时,可能会有一些未使用的空白。这就是我思考行为的原因:计算最大高度;取决于外部网格的高度。感谢您提供的信息。但是如果我移除外部ScrollViewer,DataGrid就不会显示ScrollViewer。仅当我设置例如DataGrid MaxHeight时,DataGrid ScrollViewer才会启用。我指的是最顶端的ScrollViewer。什么是DataGrid ScrollViewer?内置的那个?是的,内置的。对不起,我应该这么说。但是你用两个模板的想法很好。因此,当有多个扩展器时,我将设置MaxHeight。但我仍然需要一个解决方案,一个扩展器没有最顶端的扩展器,只有DataGrid内置。啊,好的。除了滚动条之外,您必须考虑扩展程序与ScReVIEW几乎相同。扩展器不会将完整的窗口大小传递给DataGrid。它传递无穷大,指示DataGrid按照其所需的大小而不是完整的可用大小进行排列。当扩展程序被扩展时,它将使用DataGrid所需的大小。你必须告诉它使用窗口的大小。所以可能一个模板是DataGrid单独的,另一个是Expander的列表框。但是使用ListBox而不是ItemsControl。啊,该死的……忘记了扩展器的行为……thx:为什么使用ListBox而不是ItemsControl?非常喜欢ItemsControl,因为我不需要选择。