c#-单击ListView(Xamarin.Forms)中的按钮获取当前项目

我有以下列表视图(项目源设置在外部和字符串列表):

<?xml version="1.0" encoding="utf-8" ?>
<ListView xmlns="http://xamarin.com/schemas/2014/forms"
          xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
          x:Class="XXX.EditItemsList">

    <ListView.ItemTemplate>
        <DataTemplate>
            <ViewCell>
                <StackLayout>
                    <Label Text="{Binding .}"/>
                    <Button Text="Delete"/>
                </StackLayout>
            </ViewCell>
        </DataTemplate>
    </ListView.ItemTemplate>

</ListView>

通过单击按钮,我要删除列表中的当前项目(字符串).这怎么可能?

谢谢你的帮助 :)

最佳答案
原则上,我认为@Krzysztof Skowronek给出的答案是正确的,我将简单地对其进行详细说明,并避免使用ViewModel,因为似乎您没有使用它(尽管使用它是Xamarin Forms上的最佳实践) ).

按照您自己的代码,我用XAML编写了以下代码:

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:local="clr-namespace:DeleteButton"
             x:Class="DeleteButton.MainPage">

    <ListView x:Name="listView"
              HasUnevenRows="True">
        <ListView.ItemTemplate>
            <DataTemplate>
                <ViewCell>
                    <StackLayout>
                        <Label Text="{Binding .}"/>
                        <Button Text="Delete" Clicked="Delete"/>
                    </StackLayout>
                </ViewCell>
            </DataTemplate>
        </ListView.ItemTemplate>
    </ListView>    
</ContentPage>

关于解决方案的这一部分,我将给出以下评论:

>请注意在XAML顶部使用ConntentPage而不是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更新其内容,请参阅文档以获取更多详细信息).

然后,就像已经完成的那样,我将ListView的ItemSource属性设置为Strings的集合.

最后是XAML中的EventHandler Delete,由Button上的Click事件调用.这里的算法非常简单:

首先,将发送方强制转换为Button(我们知道触发事件的对象是Button).

然后,我们将层次结构树向上移动到包含Button和Label的StackLayout并检索它的第一个子级,我们知道这是Label.

获得Label后,我们将检索其Text属性,并调用集合的Remove方法来获取该项目.

就是这样.

注意:如果我自己实现此功能,我宁愿定义一个对象集合,该对象集合将包含Text属性以及Id属性,以便准确删除所点击的元素.在上面的代码中,如果集合包含两个相同的字符串,则EventHandler将仅在第一次出现时使用.

我希望这可以帮助您找到解决问题的正确方法.

点击查看更多相关文章

转载注明原文:c#-单击ListView(Xamarin.Forms)中的按钮获取当前项目 - 乐贴网