Как удалить элемент из Sqlite & List из Xamarin - PullRequest
0 голосов
/ 18 сентября 2018

У меня большая проблема.У меня есть список в Sqlite, и я хочу удалить элемент по событию menuitem clicked.код:

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

        }

Пока удаляется только первый объект в наблюдаемой коллекции и в БД.как я могу удалить тот, на котором я нажал?Еще немного кода, если этого недостаточно:

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 голосов
/ 18 сентября 2018

Мой друг помог мне, вот решение:

    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);

    }

есть еще небольшая ошибка: вы должны нажать на элемент списка один раз, после чего вы можете удерживать /проведите и удалите его.Та же проблема с itemTapped, insted of Itemselected ... но, в целом, теперь это работает

0 голосов
/ 18 сентября 2018

Хорошо, в вашем ListView Itemtapped у вас есть следующий метод, где вы можете получить прослушиваемый элемент примерно так:

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

        };
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...