Привязка объекта в CollectionView не работает должным образом со SwipeItem

В моем XAML-файле ContentPage у меня есть такая настройка CollectionView:

<ScrollView Grid.Row="1" Padding="0,0,0,0" BackgroundColor="LightGray"  IsVisible="{ Binding ShowTrip }"  >

        <CollectionView x:Name="collectionView" 
                        ItemsSource="{Binding Items}"
                        SelectionMode="Single">
            <CollectionView.ItemTemplate>
                <DataTemplate>
                    <SwipeView>
                        <SwipeView.RightItems>
                            <SwipeItems>
                                <SwipeItem Text="Directions"
                                           IconImageSource="icon_directions.png"
                                           BackgroundColor="White"
                                           Command="{Binding Source={x:Reference myContentPage}, Path=BindingContext.DirectionsCommand}"
                                                           CommandParameter="{Binding}"/>
                                 <SwipeItem Text="Deliver"
                                            IconImageSource="icon_deliver.png"
                                            BackgroundColor="White"
                                            Command="{Binding Source={x:Reference myContentPage}, Path=BindingContext.DeliverCommand}"
                                            CommandParameter="{Binding}"/>
                           </SwipeItems>
                       </SwipeView.RightItems>
                       <Frame BackgroundColor="White" CornerRadius="0" Margin="0,5,0,0" HasShadow="True">    
                           <Grid x:DataType="model:sRemesa" Padding="0">
                               <Grid.RowDefinitions>
                                   <RowDefinition Height="Auto" />
                                   <RowDefinition Height="Auto" />
                                   <RowDefinition Height="Auto" />
                                   <RowDefinition Height="Auto" />
                                   <RowDefinition Height="Auto" />
                                   <RowDefinition Height="Auto" />
                               </Grid.RowDefinitions>
                               <Label Text="Remittance" LineBreakMode="NoWrap" FontAttributes="Bold" 
                                      Style="{DynamicResource ListItemTextStyle}" 
                                      FontSize="13" Grid.Column="0" Grid.Row="1" /> <Label Text="{Binding Number}" LineBreakMode="NoWrap" 
                                                            Style="{DynamicResource ListItemTextStyle}" 
                                                            FontSize="13" Grid.Column="1" Grid.Row="1" />
                                                    <Label Text="{Binding Customer}" 
                                                            Grid.Row="2"
                                                            LineBreakMode="NoWrap" TextTransform="Uppercase"
                                                            Style="{DynamicResource ListItemDetailTextStyle}"
                                                            FontSize="13" Grid.ColumnSpan="4" />
                                                    <Label Text="{Binding Address }" 
                                                            Grid.Row="3"
                                                            LineBreakMode="NoWrap" TextTransform="Uppercase"
                                                            Style="{DynamicResource ListItemDetailTextStyle}"
                                                            FontSize="13" Grid.ColumnSpan="4" />
                                                    <Label Text="Boxes"  FontAttributes="Bold" 
                                                            Grid.Row="4" Grid.Column="0"
                                                            LineBreakMode="NoWrap" 
                                                            Style="{DynamicResource ListItemDetailTextStyle}"
                                                            FontSize="13" />
                                                    <Label Text="{Binding BoxesQty}" 
                                                            Grid.Row="4" 
                                                            LineBreakMode="NoWrap" TextTransform="Uppercase"
                                                            Style="{DynamicResource ListItemDetailTextStyle}"
                                                            FontSize="13" Grid.Column="1" />
                                                    <Label Text="Weight"  FontAttributes="Bold" 
                                                            Grid.Row="4"
                                                            LineBreakMode="NoWrap" 
                                                            Style="{DynamicResource ListItemDetailTextStyle}"
                                                            FontSize="13" Grid.Column="2" />
                                                    <Label Text="{Binding TotalWeight }" 
                                                            Grid.Row="4" 
                                                            LineBreakMode="NoWrap" TextTransform="Uppercase"
                                                            Style="{DynamicResource ListItemDetailTextStyle}"
                                                            FontSize="13" Grid.Column="3" />
                                                </Grid>
                                            </Frame>
                                        </SwipeView>

                                    </DataTemplate>
                                </CollectionView.ItemTemplate>
                            </CollectionView>
                </ScrollView>

Items - это ObservableCollection. Проблема заключается в SwipeItems, команды выполняются хорошо, но CommandParameter иногда получает значение null, а в других случаях - ожидаемый связанный объект TItem. Такое же поведение наблюдается при использовании {Binding.} в свойстве CommandParameter.

При отладке, когда возвращается нулевое значение, я перехожу от {Binding.} К {Binding} или наоборот, и он начинает работать, как ожидалось.

Команды объявляются в viewModel следующим образом:

public ICommand DeliverCommand => new Command<TItem>(DeliverRemittance);
public ICommand DirectionsCommand => new Command<TItem>(DirectionsToDestination);

private async void DirectionsToDestination(TItem item)
{
   //....
}
private async void DeliverRemittance(TItem item)
{
   //....
}

ViewModel создается и назначается BindingContext в конструкторе ContentPages.


person KadoLakatt    schedule 15.02.2021    source источник
comment
примечание стороны, вам не нужно оборачивать collectionView внутри ScrollView, он сам обрабатывает возможность прокрутки   -  person Cfun    schedule 16.02.2021
comment
Код не выглядит неправильным, и мое тестирование с вашим кодом не воспроизводит вашу проблему. Не могли бы вы поделиться образцом, в котором возникла проблема?   -  person Leo Zhu - MSFT    schedule 16.02.2021
comment
Спасибо за ответ. @Cfun попробую немного почистить код. Если я найду решение, отвечу на вопрос сам.   -  person KadoLakatt    schedule 17.02.2021


Ответы (1)


Разметка XAML ContentPage была определена следующим образом:

<ContentPage.Content>
    <RefreshView>
        <Grid>
           <StackLayout>
               <ContentView>...</ContentView>
               <StackLayout>...</StackLayout> 
           </StackLayout> 
           <ScrollView>
               <CollectionView>...</CollectionView>
           </ScrollView>
        </Grid>
    </RefreshView>
</ContentPage.Content>

Начиная с рекомендации @Cfun:

Боковое примечание: вам не нужно оборачивать collectionView внутри ScrollView, он сам обрабатывает возможность прокрутки.

Итак, я начал очищать разметку ContentPage, я удалял ненужные элементы управления макетом, а затем CollectionView и SwipeView внутри начали отлично работать. Разметка выглядит так:

<ContentPage.Content>
        <StackLayout>
            <ContentView>
             .
             .
             .
            </ContentView>
            <CollectionView>
             .
             .
             .
            </CollectionView>
        </StackLayout> 
</ContentPage.Content>
person KadoLakatt    schedule 01.03.2021