问题描述
我正在使用数据绑定从 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
如何才能点击按钮删除给定的 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);
}