如何从 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?或者来自绑定数据的其他东西的价值?例如。 IdUserName 或其他...... 是的,您必须使用 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&lt;MyObject&gt; 填写了列表。然后我只用CommandParameter="Binding ." 填充了CommandParameter。所以我把整个对象拿回来了。然后您可以将 CommandParameter 投射到您的对象并将其从 ObservableCollection&lt;MyObject&gt; 列表中删除

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 中的图像大小?

Xamarin.Forms 如何将数据从 CollectionView 传输到不同的视图?

如何使用 Xamarin.Forms/C# 将 mp3 从 youtube 下载到 android?

如何使用 Xamarin Forms 从 HealthKit 读取 ECG 数据

如何使用 Xamarin Forms 从 HealthKit 读取 ECG 数据

如何使用 tapGesture (Xamarin.Forms) 从应用程序中的多个标签中删除选定的标签