我在我的Xamarin.Forms应用程序中创建一个简单的CRUD函数,但我无法理解如何从列表中删除。
我的问题就是这样,如何删除TextCell中的所选项目?截至目前,因为我正在使用var delete = _saveData[0];
,我显然正在删除第一项。我的猜测是我必须得到Id并将其传递给OnDelete
,但我不知道如何。
也许有更好的方法来解决这个问题?只要我能将数据显示为
,它就不必是TextCellName
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; }
}
}
答案 0 :(得分:1)
首先,添加公共属性以将当前选定的项目存储到您的代码中:
public SaveData SelectedSaveData{get; set;} // Add appropriate handling, e.g. INotifyPropertyChanged
然后将其绑定到SelectedItem
的{{1}}属性,删除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
答案 1 :(得分:0)
触发事件的一种方法 将事件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
}