【发布时间】:2020-12-07 00:28:09
【问题描述】:
我需要一些帮助。我是事件和处理程序的新手,我想开始使用事件来解耦,但我很困惑。
我有一个类,我有一个在 OnAppearing 上填充的列表视图。但是,为了防止每次单击页面时都发生 onAppearing,我加载了一次列表,然后我希望在通过使用事件从服务器添加或删除时将项目添加或删除到列表中。
ListView 页面是我最喜欢的报纸文章链接列表。当点击这些链接中的任何一个时,我会被重定向到 LinksDetailsPage,我在其中传递所选链接,然后显示与该链接相关的任何详细信息。
无论如何...
我想在我的收藏夹列表中无缝添加或删除一个项目。因此,当我单击 LinksDetailsPage 中的 AddItem 或 RemoveItem 时,我希望将该项目删除或添加到收藏夹页面列表中。在我只依靠 OnAppearing 发挥它的魔力并更新收藏夹列表之前,但是从列表中删除该项目会滞后,所以我希望它会在调用 even 时立即删除或添加,而不是在页面在 OnAppearing 上加载。但是我认为我要么没有正确调用事件,要么我的订阅者没有正确订阅。事件和代表从一开始就让我感到困惑。最重要的是,我的收藏夹列表被分组,这也是我第一次使用分组列表。 查看我的代码:
订阅者 我的收藏页面:
public FavoritesPage()
{
InitializeComponent();
}
protected override async void OnAppearing()
{
if (_isDataLoaded)
return;
_isDataLoaded = true;
base.OnAppearing();
await LoadFavorites();
}
private async Task LoadFavorites()
{
groups = new ObservableCollection<LinksTypeGroup<string, NewspaperLink>>();
var links = await _db.GetAllFavorites();
var linkType = await _manager.GetLinkCategories();
foreach(var type in linkType)
{
var typegroup = links.FindAll(
delegate(NewspaperLink link)
{
return link.iLinkTypeID == type.iLinkTypeID;
});
groups.Add(new LinksTypeGroup<string, NewspaperLink>(type.Title, typegroup));
MyList.GroupDisplayBinding = new Binding("GroupKey");
MyList.ItemsSource = groups;
}
}
public void Listener(FavoritesPage P)
{
P.LinkAdded += Item_Added;
P.LinkDeleted += Item_Deleted;
}
void Item_Deleted(object sender, int e)
{
Console.WriteLine("Item_Deleted");
// remove item from groups ..see code above
}
void Item_Added(object sender, int e)
{
Console.WriteLine("Item_Added");
// add to groups ..see code above
}
到目前为止,我没有访问任何内容。
出版商 链接详情页:
private NewspaperLink _link;
public event EventHandler< NewspaperLink> ItemAdded;
public event EventHandler< NewspaperLink> ItemDeleted;
public LinksDetailsPage(NewspaperLink link)
{
_link = link;
BindingContext = _link;
InitializeComponent();
}
protected override async void OnAppearing()
{
base.OnAppearing();
await LoadLink();
}
private async Task LoadLink()
{
var url = await db.ReturnRecipeLink(_link.iLinkID);
linkWebView.Source = url;
CheckifExists(_link);
}
}
void AddLink(object sender, System.EventArgs e)
{
var link = BindingContext as NewspaperLink;
db.InsertIntoMyList(_link);
ItemAdded?.Invoke(this, link);
}
void DeleteLink(object sender, System.EventArgs e)
{
var link = BindingContext as NewspaperLink;
db.DeleteFromMyList(_link);
ItemDeleted?.Invoke(this, link);
}
有人可以指导我如何使这个均匀过程起作用吗?
【问题讨论】:
-
您永远不会调用订阅您的事件的
Listener方法,所以当然没有任何反应。我建议您考虑使用MessagingCenter作为处理此问题的替代方法。
标签: c# xamarin event-handling