c# - Xamarin 从列表 ObservableCollection 和列表视图表单中删除项目
问题描述
我在 Xamarin(待办事项列表)上有一个简单的应用程序,其目的是动态创建和删除列表中的项目。我正在使用ObservableCollection
列表。我花了很多时间研究这个,但我无法让它工作。
现在我的应用程序可以将项目添加到列表中并将其显示在主窗体中。现在我希望它通过单击按钮从列表中删除相应的项目。
这是我的代码:
主页.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:App3"
x:Class="App3.MainPage">
<ContentPage.ToolbarItems>
<ToolbarItem Text="Add" Clicked="addnewitem"/>
</ContentPage.ToolbarItems>
<ContentPage.BindingContext>
<local:viewmod/>
</ContentPage.BindingContext>
<StackLayout>
<Editor x:Name="txtboxNAME"></Editor>
<ListView ItemsSource="{Binding Tasks}" HasUnevenRows="True" x:Name="itemListView">
<ListView.ItemTemplate>
<DataTemplate>
<ViewCell>
<Frame>
<StackLayout>
<Editor Text="{Binding Taskname}"/>
<Switch/>
<Button Text="Delete" CommandParameter="{Binding ItemName}" Clicked="DeleteClicked">
</Button>
</StackLayout>
</Frame>
</ViewCell>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</StackLayout>
</ContentPage>
MainPage.xaml.cs(MainPage 表单背后的代码)
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using Xamarin.Forms;
namespace App3
{
public partial class MainPage : ContentPage
{
static int itemid = 0;
public MainPage()
{
InitializeComponent();
BindingContext = new viewmod();
}
private void addnewitem(object sender, EventArgs e)
{
var vm = BindingContext as viewmod;
string itemnameval = "item_" + itemid.ToString();
vm.AddItems(this.txtboxNAME.Text, itemnameval);
itemid++;
}
private void DeleteClicked(object sender, EventArgs e) // Item should be deleted from the list
{
// This does not work
var itemsender = (Xamarin.Forms.Button)sender;
var item = itemsender?.BindingContext as Task;
var vm = BindingContext as viewmod;
vm?.RemoveCommand.Execute(item);
//vm.Tasks.Remove(item); // conversion error
// This does not work either. "allItems" is not defined.
TaskClass listitem = (from itm in allItems
where itm.ItemName == item.CommandParameter.ToString()
select itm).FirstOrDefault<TaskClass>();
allItems.Remove(listitem);
}
}
}
任务类.cs
namespace App3
{
class TaskClass
{
public string Taskname { get; set; }
public string ItemName { get; set; }
}
}
viewmod.cs
using System.Collections.ObjectModel;
using Xamarin.Forms;
namespace App3
{
class viewmod
{
public ObservableCollection<TaskClass> Tasks { get; set; } = new ObservableCollection<TaskClass>();
public viewmod()
{
}
public void AddItems(string taskn, string taskid)
{
Tasks.Add(new TaskClass { Taskname = $"{taskn}", ItemName=$"{taskid}" });
}
public void DelItem(TaskClass task)
{
Tasks.Remove(task);
}
public Command<TaskClass> RemoveCommand
{
get
{
return new Command<TaskClass>((task) =>
{
Tasks.Remove(task);
});
}
}
}
}
解决方案
首先修改您的 XAML =“。” 语法传递整个绑定对象
<Button Text="Delete" CommandParameter="{Binding .}" Clicked="DeleteClicked" />
然后在你的代码后面
private void DeleteClicked(object sender, EventArgs e)
{
var itemsender = (Xamarin.Forms.Button)sender;
var item = (TaskClass)itemsender?.CommandParameter;
// it would be much cleaner to keep a ref to your VM in your page
// rather than continually casting it from BindingContext
var vm = BindingContext as viewmod;
vm.Tasks.Remove(item);
}
推荐阅读
- scala - 如何将流式 Dataset[String] 转换为 Dataset[Array[String]]?
- php - 使用 mysql 的 CONCAT() 作为列名
- windows - 如何将字符串附加到单词列表中的每个单词并将新单词列表分配给变量?
- javascript - 正则表达式不正确匹配 - javascript
- javascript - 如何在 Node.js CRUD 应用程序的编辑表单中显示选择值
- macos - MacOS 中的 defaultSystemOutputDevice 和 defautOutputdevice 有什么区别?
- amp-html - 为移动访问者提供“AMP 故事”,而为桌面访问者提供“AMP 网站”?
- java - File.mkdirs() 是否需要 WRITE_EXTERNAL_STORAGE 权限
- python - 关于python的mean、max、min函数的问题
- flutter - 如何使用 Provider 在我的 Flutter 视图中获取 Provider 值?