如何在启用 ScrollViewer 的同时动态更新 ListView 高度?

How to dynamically update ListView height while keeping the ScrollViewer enabled?

ListView 放置在 UserControl 中,后者在父级 XAML 中设置为星号“*”高度。 当有超过 ListView 的项目时,我想使用 ListView 滚动项目。它应该适用于 window.

的不同大小

当我将 Grid 的 RowDefinitions 设置为固定整数时,它工作正常,但是当我尝试使用 asterix "*" 时,ScrollViewer 禁用。

我还尝试通过重写的 MeasureOverride 方法中的一些代码绑定和更新 RowDefinition 的高度,但它没有按预期工作。

这是我的用户控件中的代码:

<Grid x:Name="ContentArea"
          Background="{StaticResource MixerBackground}">
        <Grid.RowDefinitions>
            <RowDefinition Height="{x:Bind ListViewHeight}" />
        </Grid.RowDefinitions>
        <ListView
            ItemsSource="{x:Bind ViewModel.Source,Mode=TwoWay}"
            CanDragItems="True"
            CanReorderItems="True"
            AllowDrop="True"
            SelectionMode="Single"
            ScrollViewer.VerticalScrollBarVisibility="Visible">
            <ListView.ItemTemplate>
                <DataTemplate x:DataType="models:Track">
                    <Grid
                        Background="LightGray"
                        HorizontalAlignment="Left"
                        VerticalAlignment="Stretch"
                        BorderBrush="Black">
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="100"/>
                            <ColumnDefinition Width="*"/>
                        </Grid.ColumnDefinitions>
                        <Grid.RowDefinitions>
                            <RowDefinition Height="100"/>
                        </Grid.RowDefinitions>

                        <TextBlock
                            Text="{x:Bind Id}"
                            VerticalAlignment="Center"
                            HorizontalAlignment="Center"
                            FontSize="24"
                            Margin="20,5,20,5"/>

                        <Grid
                            Background="Black"
                            Width="500"
                            HorizontalAlignment="Stretch"
                            VerticalAlignment="Stretch"
                            Grid.Column="1">
                        </Grid>
                    </Grid>
                </DataTemplate>
            </ListView.ItemTemplate>
        </ListView>

我希望 ScrollViewer 能正常工作,但 ListView 保持原来的大小或滚动条被禁用 - 取决于高度值。

有什么方法可以通过滚动实现动态调整ListView的大小?

编辑

这是通过 Light MVVM 框架加载到 Frame 中的父页面 XAML 代码:

<Grid
        x:Name="ContentArea">
        <Grid
            Background="{ThemeResource SystemControlPageBackgroundChromeLowBrush}">
            <Grid.RowDefinitions>
                <RowDefinition Height="100" />
                <RowDefinition Height="*" />
                <RowDefinition Height="300" />
            </Grid.RowDefinitions>
            <maineditor:MainEditorMenuControl x:Name="ProjectMenu" />
            <maineditor:MainEditorWorkspaceControl x:Name="Workspace" Grid.Row="1"/>
            <maineditor:MainEditorMixerControl x:Name="Mixer" Grid.Row="2" />
        </Grid>
    </Grid>

编辑 2 我认为问题可能与我使用 Windows Template Studio 插件为 Visual Studio 创建的 MVVM 模板有关。如果我尝试像在我的应用程序中一样使用所有属性从头开始重新创建最小解决方案 1:1 它在新项目中有效,但在我的项目中无效。

How to dynamically update ListView height while keeping the ScrollViewer enabled?

如果您想让 RowDefinition 高度与 ListView 相同,您可以给 ListView 一个名称并使用 {Binding ElementName=MyListView,Path=ActualHeight} 语法绑定两个高度 属性。

<Grid x:Name="ContentArea">
    <Grid.RowDefinitions>
        <RowDefinition Height="{Binding ElementName=MyListView,Path=ActualHeight}" />
    </Grid.RowDefinitions>
    <ListView
    Name="MyListView"
    CanDragItems="True"
    CanReorderItems="True"
    AllowDrop="True"
    Loaded="MyListView_Loaded"
    SelectionMode="Single"
    ScrollViewer.VerticalScrollBarVisibility="Visible">
        <ListView.ItemTemplate>
            <DataTemplate >
                <Grid
                Background="LightGray"
                HorizontalAlignment="Left"
                VerticalAlignment="Stretch"
                BorderBrush="Black">
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="100"/>
                        <ColumnDefinition Width="*"/>
                    </Grid.ColumnDefinitions>
                    <Grid.RowDefinitions>
                        <RowDefinition Height="100"/>
                    </Grid.RowDefinitions>

                    <TextBlock
                    Text="{Binding}"
                    VerticalAlignment="Center"
                    HorizontalAlignment="Center"
                    FontSize="24"
                    Margin="20,5,20,5"/>

                    <Grid
                    Background="Black"
                    Width="500"
                    HorizontalAlignment="Stretch"
                    VerticalAlignment="Stretch"
                    Grid.Column="1">
                    </Grid>
                </Grid>
            </DataTemplate>
        </ListView.ItemTemplate>
    </ListView>
</Grid>