微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在 Xamarin.Forms 中删除当前 ListView 行的按钮

如何解决在 Xamarin.Forms 中删除当前 ListView 行的按钮

我正在使用数据绑定从 sqlite 数据库填充 ListView。我希望用户能够按下按钮并删除当前行。

Page1.xaml:

  <ListView x:Name="recentUserList" Margin="20,0" VerticalOptions="FillAndExpand" HorizontalOptions="FillAndExpand">
            <ListView.ItemTemplate>
                <DataTemplate >
                    <ViewCell>
                        <Frame Padding="5" Margin="0,5">
                            <Grid HeightRequest="50" HorizontalOptions="FillAndExpand" VerticalOptions="Start">
                                <Grid.ColumnDeFinitions>
                                    <ColumnDeFinition Width="*"/>
                                    <ColumnDeFinition Width="Auto"/>
                                    <ColumnDeFinition Width="Auto"/>
                                    <ColumnDeFinition Width="*"/>
                                </Grid.ColumnDeFinitions>
                                <Label Grid.Column="0" Text="{Binding UserName}"/>
                                <Button Grid.Column="3" Text="Delete" Clicked="BtnDelete_Clicked" />
                            </Grid>
                        </Frame>
                    </ViewCell>
                </DataTemplate>
            </ListView.ItemTemplate>
        </ListView>

Page1.cs:

protected override void OnAppearing()
{
        base.OnAppearing();
        recentUserList.ItemsSource = App.Database.GetUserList();
}

private void BtnDelete_Clicked(object sender,EventArgs e)
{
        var user = sender as User;
        recentUserList.Remove(user);
}

数据库

public List<User> GetUserList()
{
    return database.Query<User>("SELECT * FROM User;");
}

User.cs:

 public class User: INotifyPropertyChanged
 {
        [PrimaryKey,AutoIncrement]
        public int ID { get; set; }
        private string userName;
        public string UserName
        {
            get
            {
                return userName;
            }
            set
            {
                if (userName!= value)
                {
                    userName = value;
                    OnPropertyChanged("UserName");
                }
            }
        }
}

这会导致 Page1.cs 中 Remove 中的 recentUserList.Remove(user); 出现以下错误

错误 CS7036:没有给出对应于 'CollectionExtensions.Remove(IDictionary,TKey,out TValue)' 的所需形式参数 'value' 的参数'

如何才能点击按钮删除给定的 ListView 项/行?

解决方法

sender 对象的类型是 Button 而不是 User,尽管在这种情况下它的 BindingContext 属性是 User 类型:

private void BtnDelete_Clicked(object sender,EventArgs e)
{
        var btn = sender as Button;
        var user = btn.BindingContext as User;
        //recentUserList.Remove(user);
}

还有 recentUserList 是一个 ui 元素 (ListView) 它没有 .Remove() 方法。您需要做的是将其 ItemsSource 绑定到您将调用 .Remove() 方法的 ObservableCollection

我强烈邀请您阅读related documentation

,

首先使用 ObservableCollection

ObservableCollection<User> users;

protected override void OnAppearing()
{
        base.OnAppearing();
        recentUserList.ItemsSource = users = new ObservableCollection<User>(App.Database.GetUserList());
}

然后从数据源中删除 user,UI 将更新

private void BtnDelete_Clicked(object sender,EventArgs e)
{
        var btn = sender as Button;
        var user = btn.BindingContext as User;
        users.Remove(user);
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。