如何从Sqlite和Xamarin列表中删除项目

时间:2018-09-18 09:31:28

标签: c# sqlite xamarin xamarin.forms

我有一个大问题。我在Sqlite中有一个列表,我想通过menuitem单击事件删除一个项目。代码:

 async void MenuItem_Clicked(object sender, EventArgs e)
        {
            var nahrungsmittel = _nahrungsmittel[0];
            await _connection.DeleteAsync(nahrungsmittel);
            _nahrungsmittel.Remove(nahrungsmittel);

        }

目前,它仅删除可观察集合和db中的第一个对象。如何删除我点击的那一个?如果还不够,还有更多代码:

namespace EssenBestellen.Speisen
{
    [XamlCompilation(XamlCompilationOptions.Compile)]
    public partial class SpeisenUebersicht : ContentPage
    {

    private SQLiteAsyncConnection _connection;
    private ObservableCollection<Nahrungsmittel> _nahrungsmittel;

    public SpeisenUebersicht()
    {
        BindingContext = new 
EssenBestellen.ViewModels.NahrungsmittelListeViewModel(new 
EssenBestellen.ViewModels.PageService());
        InitializeComponent();

        _connection = DependencyService.Get<ISQLiteDb>().GetConnection();

    }

     async protected override void OnAppearing()
     {
         await _connection.CreateTableAsync<Nahrungsmittel>();

         var nahrungsmittel = await _connection.QueryAsync<Nahrungsmittel> 
("SELECT * FROM Nahrungsmittel ORDER BY NAME ASC"); //.ToListAsync();
         _nahrungsmittel = new ObservableCollection<Nahrungsmittel> 
  (nahrungsmittel);
        speisenListe.ItemsSource = _nahrungsmittel;


        base.OnAppearing();
    }

    async void Add_Clicked(object sender, EventArgs e)
    {
        await Navigation.PushAsync(new SpeisenAdd());
    }

    async void MenuItem_Clicked(object sender, EventArgs e)
    {
        var nahrungsmittel = _nahrungsmittel[0];
        await _connection.DeleteAsync(nahrungsmittel);
        _nahrungsmittel.Remove(nahrungsmittel);

    }


    private void speisenListe_ItemSelected(object sender, 
SelectedItemChangedEventArgs e)
    {

    (BindingContext as 






EssenBestellen.ViewModels.NahrungsmittelListeViewModel).SelectNahrungsmittel(e.S 



  electedItem as Nahrungsmittel);

    }

    private void MenuItem_Clicked_1(object sender, EventArgs e)
    {
        DisplayAlert("Kommt Noch","noch nicht implementiert", "OK");

    }


}
}

Xaml文件更新

<ContentPage.ToolbarItems>
<ToolbarItem Icon="plus.png" Text="Neu" Activated="Add_Clicked"/>
</ContentPage.ToolbarItems>

<StackLayout>

<ListView x:Name="speisenListe" HasUnevenRows="True" ItemsSource="{Binding Nahrungsmittels}" SelectedItem="{Binding SelectedNahrungsmittel, Mode=TwoWay}" ItemTapped="speisenListe_ItemTapped" ItemSelected="speisenListe_ItemSelected">
    <ListView.ItemTemplate>
        <DataTemplate>
            <ViewCell>
                <ViewCell.ContextActions>
                    <MenuItem Text="Bearbeiten" IsDestructive="False" Clicked="MenuItem_Clicked"  Command="{Binding .}" />
                    <MenuItem Text="Löschen" IsDestructive="True" Clicked="MenuItem_Clicked"  Command="{Binding .}" />
                </ViewCell.ContextActions>
                <StackLayout Orientation="Horizontal" Padding="5">
                    <Label Text="{Binding Id}" HorizontalOptions="StartAndExpand"/>
                    <Label Text="{Binding Name}" TextColor="Gray" HorizontalOptions="CenterAndExpand"/>
                    <Label Text="{Binding Preis}" TextColor="Gray" HorizontalOptions="EndAndExpand"/>
                </StackLayout>
            </ViewCell>
        </DataTemplate>
    </ListView.ItemTemplate>
</ListView>

2 个答案:

答案 0 :(得分:0)

在您的ListView Itemtapped中,您可以使用以下方法在其中获取被点击的项目,如下所示:

 void speisenListe_ItemTapped(object sender, ItemTappedEventArgs e) 
        {
           var clickedObj= e.Item as Nahrungsmittel;
           await _connection.DeleteAsync(clickedObj);
          _nahrungsmittel.Remove(clickedObj);

        };

答案 1 :(得分:0)

我的一个朋友帮助了我,这是解决方案:

    async void MenuItem_Clicked(object sender, EventArgs e)
    {
        if (_nm != null)
        {
            await _connection.DeleteAsync(_nm);
            _nahrungsmittel.Remove(_nm);
        }

    }


    private void speisenListe_ItemSelected(object sender, SelectedItemChangedEventArgs e)
    {
       if (e.SelectedItem is Nahrungsmittel nm)
        {
            _nm = nm;
        }
    (BindingContext as EssenBestellen.ViewModels.NahrungsmittelListeViewModel).SelectNahrungsmittel(e.SelectedItem as Nahrungsmittel);

    }

仍然存在一个小错误:您必须点击一次listItem,然后才能按住/滑动并删除它。与itemTapped相同的问题,由Itemselected插入...但是,现在全部起作用了