我正在尝试删除视图模型的 TableData 中名为 SelectedOrder 的对象。 绑定工作完美,但是当我点击要删除的项目时,在我的视图模型中,当激活 RelayCommand 时,变量 SelectedOrder 为空... 你能告诉我为什么吗?
<CollectionView
ItemsSource="{Binding Orders}"
SelectedItem="{Binding SelectedOrder}">
<CollectionView.ItemTemplate>
<DataTemplate>
<Frame>
<Frame.GestureRecognizers>
<TapGestureRecognizer Command="{Binding Source={RelativeSource AncestorType={x:Type viewmodels:MainPageViewModel}}, Path=DeleteOrderCommand}" NumberOfTapsRequired="1" />
</Frame.GestureRecognizers>
<Label
FontSize="Medium"
HorizontalOptions="Start"
Text="{Binding Id}"
VerticalTextAlignment="Center" />
</Frame>
</DataTemplate>
</CollectionView.ItemTemplate>
<CollectionView.ItemsLayout>
<LinearItemsLayout ItemSpacing="5" Orientation="Vertical" />
</CollectionView.ItemsLayout>
</CollectionView>
[ObservableProperty]
private Order selectedOrder;
[RelayCommand]
private async Task DeleteOrder()
{
App.OrdersRepo.TestDeleteItem(SelectedOrder);
Orders = await App.OrdersRepo.TestGetItems();
}
问题出在哪里?
根据你的代码,我在我这边创建了一个演示,我发现如果我们触发外层Frame的
Frame.GestureRecognizers
事件,那么CollectionView的SelectionChangedCommand
事件将不会被触发。因此,一旦点击 SelectedOrder
,Frame
的值将不会更新。
但作为解决方法,您可以将当前项目传递给事件
DeleteOrderCommand
。
您可以为框架的
CommandParameter="{Binding .}"
添加TapGestureRecognizer
。
请参考以下代码:
<CollectionView.ItemTemplate>
<DataTemplate>
<Frame BackgroundColor="pink" >
<Frame.GestureRecognizers>
<TapGestureRecognizer Command="{Binding Source={RelativeSource AncestorType={x:Type local:MainPageViewModel}}, Path=DeleteOrderCommand }" CommandParameter="{Binding .}" NumberOfTapsRequired="1" />
</Frame.GestureRecognizers>
<Label
FontSize="Medium"
HorizontalOptions="Start"
Text="{Binding Id}"
VerticalTextAlignment="Center" />
</Frame>
</DataTemplate>
</CollectionView.ItemTemplate>
并修改方法
DeleteOrder
[RelayCommand]
private async Task DeleteOrder(Order obj)
{
// do something
//App.OrdersRepo.TestDeleteItem(obj);
// Orders = await App.OrdersRepo.TestGetItems();
}