gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 14:46:22 24 4
gpt4 key购买 nike

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

<?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 表单上)。

按照您自己的代码,我用 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 属性设置为字符串集合,正如您已经完成的那样。

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

首先,发送者被转换为一个 Button(我们知道触发事件的对象是一个 Button)。

然后我们沿着层次结构树向上走到包含 Button 和 Label 的 StackLayout 并检索它的第一个子节点,我们知道它是 Label。

一旦我们有了 Label,我们就会检索它的 Text 属性并调用集合的 Remove 方法来获取该项目。

就是这样。

注意:如果我自己实现此功能,我宁愿定义一个包含 Text 属性和 Id 属性的对象集合,以便准确删除点击的元素。在上面的代码中,如果集合包含两个相同的字符串,则 EventHandler 会简单地处理第一次出现的字符串。

希望本文能帮助您找到解决问题的正确方法。

关于c# - 通过单击 ListView (Xamarin.Forms) 中的按钮获取当前项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49221187/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com