Как динамически обновлять высоту ListView, оставляя ScrollViewer включенным? - PullRequest
0 голосов
/ 01 мая 2019

ListView размещен внутри UserControl, который в родительском XAML установлен на звездочку "*". Я хочу использовать ListView с возможностью прокрутки элементов, когда есть элементы, которые превышают ListView. Должно работать для разных размеров окна.

Работает нормально, когда я устанавливаю Grid RowDefinitions с фиксированным целым числом, но когда я пытаюсь использовать звездочку, "*" ScrollViewer отключает.

Я также пытался связать и обновить высоту RowDefinition с помощью некоторого кода в переопределенном методе MeasureOverride, но он не сработал, как ожидалось.

Вот код внутри моего UserControl:

<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 с помощью прокрутки?

Редактировать

Вот код XAML родительской страницы, который загружается в Frame через каркас Light MVVM:

<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>

How it looks now, and also after trying Nico solution (image)

Редактировать 2 Я думаю, что проблема может быть связана с шаблоном MVVM, который я создал с помощью плагина Windows Template Studio для Visual Studio. Если я пытаюсь воссоздать минимальное решение с нуля со всеми свойствами 1: 1, как в моем приложении, оно работает в новом проекте, но не в моем.

1 Ответ

0 голосов
/ 02 мая 2019

Как динамически обновлять высоту ListView, оставляя ScrollViewer включенным?

Если вы хотите сделать RowDefinition height таким же, как 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>

enter image description here

...