Xamarin - CollectionView VerticalItemSpacing не работает - PullRequest
0 голосов
/ 06 марта 2020

Я не знаю, что может быть не так, я протестировал несколько вариантов кода, и ни один из них не сработал. Я также пробовал вариант с Frame и StackLayout.

<ScrollView VerticalOptions="StartAndExpand" Orientation="Vertical">
    <Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto" />
    </Grid.RowDefinitions>

    <CollectionView Grid.Row="0" x:Name="StockCards_CollectionView" ItemsSource="{Binding lc_ReleaseBill.Items}" SelectionChangedCommand="{Binding OnCollectionViewSelectionChanged}" EmptyView="List is empty." SelectionMode="Single"  SelectedItem="{Binding SelectedStockCard, Mode=TwoWay}">
            <CollectionView.ItemsLayout>
                <GridItemsLayout Orientation="Vertical"  VerticalItemSpacing="20"/>
            </CollectionView.ItemsLayout>
            <CollectionView.ItemTemplate>
                <DataTemplate>
                    <Grid>
                        <Grid.RowDefinitions>
                            <RowDefinition Height="Auto" />
                            <RowDefinition Height="Auto" />
                        </Grid.RowDefinitions>
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="Auto" />
                            <ColumnDefinition Width="Auto" />
                        </Grid.ColumnDefinitions>
                            <Label Grid.Row="0" Grid.Column="0"  Text="{Binding Name}" FontAttributes="Bold" VerticalOptions="Start" TextColor="White"/>

                            <Label Grid.Row="1" Grid.Column="0"  Text="{Binding Unit}" FontAttributes="Italic"  VerticalOptions="Start" TextColor="White"/>

                            <Label Grid.Row="0" Grid.Column="1"  Text="{Binding Price_WithVAT_Unit}" FontAttributes="Bold"  HorizontalOptions="End" FontSize="19" TextColor="#00c8df"/>

                            <Label Grid.Row="1" Grid.Column="1"  Text="{Binding Amount}" FontAttributes="Bold"  HorizontalOptions="End" TextColor="White"/>
                    </Grid>
                </DataTemplate>
            </CollectionView.ItemTemplate>
        </CollectionView>
    </Grid>
</ScrollView> 

Работает на Xamarin.Forms 4.5.0.356 и тот же результат был на 4.4.0.991640.

Ответы [ 2 ]

0 голосов
/ 09 марта 2020

Я исправил это, установив Интервал между Элементами Представления Коллекции из кода, что не идеально, но лучше, чем установка поля для Сетки внутри Представления Коллекции.

CollectionView.ItemsLayout = new LinearItemsLayout(ItemsLayoutOrientation.Vertical)
    {
       ItemSpacing = 20
    };
0 голосов
/ 06 марта 2020

Вы можете попробовать добавить Margin к контенту DataTemplate внутри ContentView

<CollectionView Grid.Row="0" x:Name="StockCards_CollectionView" ItemsSource="{Binding lc_ReleaseBill.Items}" SelectionChangedCommand="{Binding OnCollectionViewSelectionChanged}" EmptyView="List is empty." SelectionMode="Single"  SelectedItem="{Binding SelectedStockCard, Mode=TwoWay}">
    <CollectionView.ItemsLayout>
        <GridItemsLayout Orientation="Vertical"/>
    </CollectionView.ItemsLayout>
    <CollectionView.ItemTemplate>
        <DataTemplate>
            <ContentView>
                <Grid Margin="0,0,0,20">
                   ...
                </Grid>
            <(ContentView>
        </DataTemplate>
    </CollectionView.ItemTemplate>
</CollectionView>

Кроме того, вы должны попробовать использовать ItemSpacing="20" вместо VerticalItemSpacing

Редактировать: так как ItemSpacing делает работать, но только после того, как в нем будет еще несколько элементов, достаточных для прокрутки назад и вперед, я бы попробовал эту технику:

Установите для свойства IsVisible значение false, а после того, как в вашей Коллекции есть данные, установите ее в true:

<CollectionView IsVisible="{Binding CollectionHasData}" Grid.Row="0" x:Name="StockCards_CollectionView" ItemsSource="{Binding lc_ReleaseBill.Items}" SelectionChangedCommand="{Binding OnCollectionViewSelectionChanged}" EmptyView="List is empty." SelectionMode="Single"  SelectedItem="{Binding SelectedStockCard, Mode=TwoWay}">

private bool _collectionHasData;

public bool CollectionHasData
{
    get => _item;
    set { _collectionHasData = value; }
}

...

lc_ReleaseBill.Items = Data;
CollectionHasData = true;

Я не знаю, как вы выбираете ваши данные, если вы их устанавливаете или объект уже имеет данные, но дело в том, когда ваши Предметы имеют некоторые значения, установите bool в true

...