繁体   English   中英

从TextCell 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并绑定到ItemSelectedListView来代替。

<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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM