【问题标题】:Button to delete current ListView Row in Xamarin.Forms用于删除 Xamarin.Forms 中当前 ListView 行的按钮
【发布时间】:2021-02-02 07:22:01
【问题描述】:

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

Page1.xaml:

  <ListView x:Name="recentUserList" Margin="20,0" VerticalOptions="FillAndExpand" HorizontalOptions="FillAndExpand">
            <ListView.ItemTemplate>
                <DataTemplate >
                    <ViewCell>
                        <Frame Padding="5" Margin="0,0,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;");
}

用户.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 中 recentUserList.Remove(user); 中的 Remove 出现以下错误。

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

我怎样才能使它可以单击按钮删除给定的ListView 项目/行?

【问题讨论】:

    标签: c# xamarin xamarin.forms xamarin.forms.listview


    【解决方案1】:

    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 到一个ObservableCollection 你将调用.Remove() 方法。

    我强烈邀请您阅读related documentation

    【讨论】:

      【解决方案2】:

      首先使用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);
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-06-29
        • 2016-07-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-11-28
        相关资源
        最近更新 更多