Привязка объекта в 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.
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>