从TextCell Xamarin.Forms中删除所选项目

时间:2018-03-20 12:50:03

标签: c# xaml xamarin xamarin.forms

我在我的Xamarin.Forms应用程序中创建一个简单的CRUD函数,但我无法理解如何从列表中删除。

我的问题就是这样,如何删除TextCell中的所选项目?截至目前,因为我正在使用var delete = _saveData[0];,我显然正在删除第一项。我的猜测是我必须得到Id并将其传递给OnDelete,但我不知道如何。

也许有更好的方法来解决这个问题?只要我能将数据显示为

,它就不必是TextCell
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; }
    }
}

2 个答案:

答案 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
 }