删除 collectionView .NET Maui 中的项目时出现问题

问题描述 投票:0回答:1

我正在尝试删除视图模型的 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();
 }

问题出在哪里?

android .net command maui collectionview
1个回答
0
投票

根据你的代码,我在我这边创建了一个演示,我发现如果我们触发外层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();

    }
© www.soinside.com 2019 - 2024. All rights reserved.