如何从 Xamarin Forms ListView 中删除项目?
How to remove an item from a Xamarin Forms ListView?
我正在尝试从 ListView
中删除 items/rows 但困难在于我还需要传递一些委托或触发一些事件或其他东西,所以当一个人点击一个按钮时为了删除该行,我的代码在其他地方处理了一些其他逻辑(例如,从数据库中删除该项目或其他)。
我有一个自定义控件:
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;
}
}
从这里开始,我不知道如何使按钮触发事件或通过构造函数传递一些删除,因此针对个人执行一些自定义逻辑 cell/row/item将被删除。
您可以执行以下操作:
这是我的模特 class :
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
中删除。
我发现了一个类似的方法,我想分享一下。我用 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);
}
我正在尝试从 ListView
中删除 items/rows 但困难在于我还需要传递一些委托或触发一些事件或其他东西,所以当一个人点击一个按钮时为了删除该行,我的代码在其他地方处理了一些其他逻辑(例如,从数据库中删除该项目或其他)。
我有一个自定义控件:
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;
}
}
从这里开始,我不知道如何使按钮触发事件或通过构造函数传递一些删除,因此针对个人执行一些自定义逻辑 cell/row/item将被删除。
您可以执行以下操作:
这是我的模特 class :
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
中删除。
我发现了一个类似的方法,我想分享一下。我用 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);
}