我有一个大问题。我在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>
答案 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插入...但是,现在全部起作用了