繁体   English   中英

如何从Xamarin Forms ListView中删除项目?

[英]How to remove an item from a Xamarin Forms ListView?

我正在尝试从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;
    }
}

从这里开始,我不知道如何使按钮触发事件或可以通过构造函数传递一些删除,因此对要删除的单个单元格/行/项目执行了一些自定义逻辑。

您可以执行以下操作:

这是我的模型课:

public class Item  
{  
   public string ItemName { get; set; }  
   public string ItemDetails { get; set; }  
}  

并且在我的XAML中,或者您也可以用代码编写,将其绑定到Item模板的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

这是说明的方案的完整源代码- 使用XAMARIN.FORMS在Listview中处理子控件事件

另外,教程- 如何使用Xamarin.Forms处理自定义ListView的行中的行选择和删除按钮表单还说明了从listview删除。

我找到了一种类似的方法,我想分享一下。 我用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方法相同

我只是使用删除按钮

  public void OnDelete(object sender, EventArgs e)
    {
        var mi = ((MenuItem)sender);

        PhotoViewModel photo= ((photoViewModel)mi.CommandParameter);
        photoModel.Remove(photo);
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM