原则上,我认为@Krzysztof Skowronek给出的答案是正确的,我将尝试详细解释一下,并避免使用ViewModel,因为似乎您没有使用它(尽管在Xamarin Forms中使用它是最佳实践)。
按照您自己的代码,我在XAML中编写了以下代码:
<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http:
xmlns:x="http:
xmlns:local="clr-namespace:DeleteButton"
x:Class="DeleteButton.MainPage">
<ListView x:Name="listView"
HasUnevenRows="True">
<ListView.ItemTemplate>
<DataTemplate>
<ViewCell>
<StackLayout>
<Label Text=""/>
<Button Text="Delete" Clicked="Delete"/>
</StackLayout>
</ViewCell>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</ContentPage>
关于此解决方案的这一部分,我想提出以下评论:
请注意在XAML顶部使用了ContentPage而不是ListView,这是有意为之吗?
然后,请注意在ListView上添加了x:Name属性。它将用于从后台代码与ListView进行通信。
另外请注意HasUnevenRows属性设置为True。这会自动调整ListView行的高度。
最后,请查看Button中我将Clicked事件设置为“Delete”,这是后台代码中事件处理程序的名称,您将会看到。
在后台代码中我编写了:
using System;
using System.Collections.ObjectModel;
using Xamarin.Forms;
namespace DeleteButton
{
public partial class MainPage : ContentPage
{
ObservableCollection<String> list;
public MainPage()
{
InitializeComponent();
}
protected override void OnAppearing()
{
base.OnAppearing();
list = new ObservableCollection<string>()
{
"Task 1", "Task 2", "Task 3", "Task 4", "Task 5",
"Task 6", "Task 7", "Task 8", "Task 9", "Task 10"
};
listView.ItemsSource = list;
}
public void Delete(Object Sender, EventArgs args)
{
Button button = (Button)Sender;
StackLayout listViewItem = (StackLayout)button.Parent;
Label label = (Label)listViewItem.Children[0];
String text = label.Text;
list.Remove(text);
}
}
}
在那里,我将字符串列表定义为ObservableCollection(ObservableCollection会导致ListView在每次更改时得到通知,以便更新其内容,请参见文档以获取更多详细信息)。
然后,像您已经做的那样,将ListView的ItemSource属性设置为字符串集合。
最后,在XAML中通过Button的Click事件调用EventHandler Delete。这里的算法非常简单:
首先,将sender转换为Button(我们知道触发事件的对象是Button)。
然后我们向上遍历层次结构,直到包含Button和Label的StackLayout,并检索第一个子项,我们知道它是Label。
一旦我们有了Label,我们检索它的Text属性并调用集合的Remove方法,以摆脱该项。
就是这样。
注意:如果我自己实现此功能,我宁愿定义一个对象集合,其中包含Text属性和Id属性,以便准确删除点击的元素。在上面的代码中,如果集合包含两个相同的字符串,EventHandler将仅寻找第一个出现的字符串。
我希望这可以帮助您找到解决问题的正确方法。
BindingContext.
,谢谢。 - Raj K