[英]How to delete item from SQLite PCL database on Xamarin.Forms?
[英]Delete selected item from TextCell Xamarin.Forms
我在Xamarin.Forms应用程序中制作了一个简单的CRUD函数,但是我不明白如何从列表中删除。
我的问题是,如何删除TextCell中的选定项目? 到目前为止,由于我正在使用var delete = _saveData[0];
我显然正在删除第一项。 我的猜测是我必须获取ID并将其传递给OnDelete
但我不知道如何。
也许有更好的方法吗? 只要我可以将数据呈现为
Name
Status
然后能够例如长按该单元格并选择将其删除。
我的xaml页面:
StatusPage.xaml
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="MyCRUDApp.StatusPage"
Title="Status"
Icon="ic_info.png">
<ContentPage.Content>
<StackLayout>
<Label Text="Choose status:"/>
<Entry Placeholder="Firstname Lastname" x:Name="Name"/>
<Entry Placeholder="Available/Busy" x:Name="Status"/>
<Button Text="Add" Clicked="OnAdd"/>
<Label Text="Statuses:" VerticalOptions="End"/>
<ListView VerticalOptions="EndAndExpand" x:Name="mylistview">
<ListView.ItemTemplate>
<DataTemplate>
<TextCell Text="{Binding Name}"
Detail="{Binding Status}"
Tapped="OnDelete"/>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</StackLayout>
</ContentPage.Content>
</ContentPage>
后面代码的相关部分:
StatusPage.xaml.cs
namespace MyCRUDApp
{
[XamlCompilation(XamlCompilationOptions.Compile)]
public partial class StatusPage : ContentPage
{
private SQLiteAsyncConnection _connection;
private ObservableCollection<SaveData> _saveData;
public StatusPage()
{
InitializeComponent ();
_connection = DependencyService.Get<ISQLiteDb>().GetConnection();
}
protected override async void OnAppearing()
{
base.OnAppearing();
await _connection.CreateTableAsync<SaveData>();
var abc = await _connection.Table<SaveData>().ToListAsync();
_saveData = new ObservableCollection<SaveData>(abc);
mylistview.ItemsSource = _saveData;
}
void OnAdd(object sender, EventArgs e)
{
var SaveData = new SaveData { Name = Name.Text, Status = Status.Text };
_connection.InsertAsync(SaveData);
_saveData.Add(SaveData);
}
void OnDelete(object sender, EventArgs e)
{
var delete = _saveData[0];
_connection.DeleteAsync(delete);
_saveData.Remove(delete);
}
}
}
我的SaveData类
SaveData.cs
namespace MyCRUDApp.Models
{
public class SaveData
{
[PrimaryKey, AutoIncrement]
public int Id { get; set; }
[MaxLength(255)]
public string Name { get; set; }
[MaxLength(255)]
public string Status { get; set; }
}
}
首先,添加一个公共属性以将当前选定的项存储到您的代码中:
public SaveData SelectedSaveData{get; set;} // Add appropriate handling, e.g. INotifyPropertyChanged
然后绑定这个到SelectedItem
的财产ListView
,去除Tapped
上的结合TextCell
并绑定到ItemSelected
上ListView
来代替。
<ListView VerticalOptions="EndAndExpand"
x:Name="mylistview"
ItemSelected="OnDelete"
SelectedItem="{Binding SelectedSaveData, Mode=TwoWay}">
<ListView.ItemTemplate>
<DataTemplate>
<TextCell Text="{Binding Name}"
Detail="{Binding Status}"/>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
现在, SelectedSaveData
将始终保留在ListView
中选择的那个,并且可以在您的方法中使用,例如
void OnDelete(object sender, EventArgs e)
{
_connection.DeleteAsync(SelectedSaveData);
_saveData.Remove(SelectedSaveData);
}
触发事件的一种方法将事件ItemTapped添加到listView
<ListView x:Name="ObjectList"
**ItemTapped="OnItemTapped"**
HasUnevenRows="True">
事件实现看起来像
public void OnItemTapped ( object o, ItemTappedEventArgs e ) {
var item = e.Item as Object;
//here you can call the delete function
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.