Удаление Xamarin из listview базы данных sqlite

#c# #sql #xamarin

#c# #sql #xamarin

Вопрос:

Здесь я видел несколько похожих вопросов, но мои несколько отличались. В приложении было несколько категорий книг, при нажатии открывался список книг

     public class CategoryItem
{
    [PrimaryKey, AutoIncrement]
    public int ID { get; set; }
    public string Name { get; set; }
}
  

XAML

 <ListView x:Name="listViewCategory" Margin="20" ItemSelected="OnListItemSelected">
...
  <ViewCell>
  ...
  <ImageButton Source="more.png" Pressed="OnDeleteClicked"/> 
  

Вот метод

         async void OnListItemSelected(object sender, SelectedItemChangedEventArgs e)
    {
        //((App)App.Current).ResumeAtTodoId = (e.SelectedItem as TodoItem).ID;
        //Debug.WriteLine("setting ResumeAtTodoId = "   (e.SelectedItem as TodoItem).ID);
        if (e.SelectedItem != null)
        {
            await Navigation.PushAsync(new BooksListPage
            {
                BindingContext = e.SelectedItem as CategoryItem
            });
        }
    }

    public async void OnDeleteClicked(object sender, EventArgs e)            
    {
        var todoItem = (CategoryItem)BindingContext;
        await App.Database.DeleteCategoryAsync(todoItem);
        await Navigation.PopAsync();
    }
  

CategoryItemDatabase

 public Task<int> DeleteCategoryAsync(CategoryItem item)
    {
        return database.DeleteAsync(item);
    }
  

Я добавил imagebutton для удаления категории в списке, но получил ошибку:

 "Cannot delete Object: it has no PK"
  

p.s.
извините за мой плохой английский

Комментарии:

1. где код для DeleteCategoryAsync? Вы уверены, что TodoItem имеет установленный идентификатор?

2. Спасибо, что посмотрели мой вопрос. Я отредактировал сообщение и добавил код

3. BindingContext — это BindingContext вашей страницы, а не отдельный элемент, на который вы нажали. Таким образом, ваше приведение, вероятно, завершается с ошибкой, и TodoItem, вероятно, равен null

4. <ImageButton Source=»more.png» Pressed=»OnDeleteClicked»/> я подумал, тогда listview создал все кнопки imagebuttons, привязанные к отдельному элементу. Можете ли вы, пожалуйста, показать мне, как это сделать?

Ответ №1:

Но если я собираюсь редактировать CategoryPage из listview:

 async void OnListItemSelected(object sender, SelectedItemChangedEventArgs e)
{
    if (e.SelectedItem != null)
    {
        await Navigation.PushAsync(new CategoryItemPage
        {
            BindingContext = e.SelectedItem as CategoryItem
        });
    }
}
  

И использование кнопки для удаления

    var deleteButton = new Button { Text = "Delete" };
        deleteButton.Clicked  = async (sender, e) =>
        {
            var categoryItem = (CategoryItem)BindingContext;
            await App.Database.DeleteCategoryAsync(categoryItem);
            await Navigation.PopAsync();
        };
  

Это работает. Но я хочу удалить из listview