如何从 Xamarin Forms ListView 中删除项目?
Posted
技术标签:
【中文标题】如何从 Xamarin Forms ListView 中删除项目?【英文标题】:How to remove an item from a Xamarin Forms ListView? 【发布时间】:2021-10-27 00:18:39 【问题描述】:我正在尝试从 ListView
中删除项目/行,但困难在于我还需要传递一些委托或触发一些事件或其他东西,所以当一个人单击按钮删除该行时,我的代码在其他地方处理一些其他逻辑(例如,从数据库中删除项目或其他)。
我制作了一个自定义控件:
public class SportsTeam : StackLayout ..
在此控件中,其中一个元素是 ListView
,它列出了运动队中的所有人。
var viewModel = teamMembers.Select(x => new SportsTeamViewModel(x));
return new ListView
HasUnevenRows = true,
ItemSource = viewModel,
ItemTemplate = new DataTemplate(typeof(SportsTeamViewCell));
;
在SportsTeamViewCell
里面我有以下内容:
private Grid CreateContent()
var grid = new Grid();
// Setup row and column definitions.
// Add items to the Grid
grid.Children.Add(...);
var removeButton = RemoveButton;
grid.Children.Add(removeButton);
Grid.SetRowSpan(removeButton, 2);
return grid;
private Button RemoveButton
get
var button = new Button
Image = "Icons/remove.png"
;
return button;
从这里开始,我不知道如何使按钮触发事件或某些删除可以通过构造函数传入,因此针对单个单元格/行/项目执行一些自定义逻辑被删除。
【问题讨论】:
将要删除的行的 ID 传递给 RemoveButton 的单击事件处理程序。 如何找到要删除的行的Id?或者每一行可以有另一个我给它的特殊 ID 吗?像一些隐藏的魔法ID?或者来自绑定数据的其他东西的价值?例如。Id
或 UserName
或其他......
是的,您必须使用 Bindings 并将模型的 Id 属性绑定到按钮的单击事件。
【参考方案1】:
这是你可以做的:
这是我的模型课:
public class Item
public string ItemName get; set;
public string ItemDetails get; set;
在我的 XAML 中,或者您也可以在代码中编写它,绑定到您的项目模板的 Command Parameter
:
<Button Text="Delete" CommandParameter="Binding ItemName" Clicked="DeleteClicked"></Button>
完整的项目模板如下:
<ListView.ItemTemplate>
<DataTemplate>
<ViewCell>
<ViewCell.View>
<StackLayout Orientation="Horizontal">
<Label Text="Binding ItemName" HorizontalOptions="StartAndExpand" FontSize="30"></Label>
<Button Text="Delete" CommandParameter="Binding ItemName" Clicked="DeleteClicked">
</Button>
</StackLayout>
</ViewCell.View>
</ViewCell>
</DataTemplate>
</ListView.ItemTemplate>
在你的代码文件中你可以这样做:
public void DeleteClicked(object sender, EventArgs e)
var item = (Xamarin.Forms.Button)sender;
Item listitem = (from itm in allItems
where itm.ItemName == item.CommandParameter.ToString()
select itm)
.FirstOrDefault<Item>();
allItems.Remove(listitem);
重要:这只会从绑定集合中删除项目。要从原始列表中删除它,您需要使用ObservableCollection
这里是解释场景的完整源代码 - Handling Child Control Event in Listview using XAMARIN.FORMS。
还有教程 - How to handle Row selection and delete Button in Row For Custom ListView using Xamarin.Forms 也解释了从 listview
中删除。
【讨论】:
太棒了@Rohit!这是我真正希望得到的答案类型 :) 今天晚些时候我会破解这段代码。谢谢老哥! 嗨@rohit - 我玩过你的代码,但我似乎无法理解。首先,我得到CommandParameter
。美好的。其次,我确实不想 将Clicked
的代码放入 我的控件中。这是因为我不知道这个通用控件一旦被点击会做什么。我想传递要处理的方法,当点击时,进入这个控件。所以逻辑仍然在这个控制之外:)
如果您希望逻辑在外部,您可以使用 MessagingCenter 订阅点击事件,或者尝试使用 .NET 事件处理程序自己附加到事件。
我正在尝试将一个事件附加到我的列表视图中......这就是我卡住的地方。列表视图采用ItemTemplate = new DataTemplate(typeof(SportsTeamViewCell));
模板。我只是不知道如何(或在哪里)附加我的自定义事件...... ???
如果您尝试在控制器和 Viewmodel 之间获取事件,请查看 Xamarin 消息中心【参考方案2】:
我找到了类似的方法,我想分享它。我用ObservableCollection<MyObject>
填写了列表。然后我只用CommandParameter="Binding ."
填充了CommandParameter。所以我把整个对象拿回来了。然后您可以将 CommandParameter
投射到您的对象并将其从 ObservableCollection<MyObject>
列表中删除
XAML:
CommandParameter="Binding ."
填写我的清单:
savingExpensesCollection = new ObservableCollection<SavingsExpensesEntry> ();
savingExpensesCollection .Add (new SavingsExpensesEntry ("1000 mAh Akku", "Dampfgarten", new DateTime (635808692400000000), 8.95));
savingExpensesCollection .Add (new SavingsExpensesEntry ("Cool-Mint Aroma", "Dampfgarten", new DateTime (635808692400000000), 3.95));
savingExpensesCollection .Add (new SavingsExpensesEntry ("Basis", "Dampfgarten", new DateTime (635808692400000000), 13.65));
savingExpensesList.ItemsSource = savingExpenses;
事件处理程序:
void OnDelete(object sender, EventArgs e)
var menuItem = ((MenuItem)sender);
SavingsExpensesEntry see ((SavingsExpensesEntry)menuItem.CommandParameter);
savingExpensesCollection .Remove (see);
我使用的是 MenuItem
,但它与 Button
的方法相同
【讨论】:
【参考方案3】:我刚刚使用了删除按钮
public void OnDelete(object sender, EventArgs e)
var mi = ((MenuItem)sender);
PhotoViewModel photo= ((photoViewModel)mi.CommandParameter);
photoModel.Remove(photo);
【讨论】:
以上是关于如何从 Xamarin Forms ListView 中删除项目?的主要内容,如果未能解决你的问题,请参考以下文章
Xamarin.Forms 如何将数据从 CollectionView 传输到不同的视图?
如何使用 Xamarin.Forms/C# 将 mp3 从 youtube 下载到 android?
如何使用 Xamarin Forms 从 HealthKit 读取 ECG 数据