#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