c# - 如何从 Xamarin 的 Sqlite 和列表中删除项目
问题描述
我有一个大问题。我在 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>
解决方案
我的一个朋友帮助了我,这是解决方案:
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 ......但是,现在一切都在工作
推荐阅读
- authentication - 在基于令牌的身份验证中,应用服务器如何知道哪些令牌是有效的?
- ios - 在检索更改的 CloudKit 记录时识别记录更改的类型
- angularjs - angular-ui-bootstrap 2.5.6 不适用于 AngularJS 1.7.8
- ember.js - ember-leaflet - 使用缩放初始化地图以适合所有引脚
- blogger - 如何去除博客页面底部的灰色条?
- shell - 需要语法才能同时使用 Ansible shell 和命令模块
- python - 查找一直未能达到目标的 ID
- python - 从大文本文件中过滤停用词(使用包:nltk.corpus)
- javascript - 在方法的回调函数中使用变量
- azure - 通过 web.config 将所有请求的 URI 重定向到(https 和非 www)