Xamarin中的事件和委托构成父页面和子页面 [英] Events and Delegates in Xamarin forms parent and child pages
问题描述
我需要一些帮助.我是事件和处理程序的新手,我想开始将事件用于去耦目的,但我感到困惑.
I need some help. I am new to Events and handlers and I would like to begin using events for decoupling purposes but I am confused.
我有一个类,其中有一个列表视图,该列表视图填充在OnAppearing上.但是,为了防止每次单击页面时都会出现onAppearing,我加载了一次列表,然后希望通过使用事件从服务器添加或删除项目后,将项目添加到列表中或从列表中删除.
I have a class where I have a list view that is populated on OnAppearing. However to prevent onAppearing to happen each time the page is clicked I load the list once and then I would like to have items to get added or deleted to the list upon being added or removed from the server through the use of events.
ListView页面是我最喜欢的报纸文章链接的列表.当单击这些链接中的任何一个时,我将重定向到LinksDetailsPage,在其中输入所选链接,然后显示与该链接关联的所有详细信息.
The ListView page is a list of my favorite newspaper article Links. When clicking on any one of these links I get redirected to a LinksDetailsPage where I pass in the selected link and then display any details associated with the link.
无论如何...
我想无缝地添加或删除我的收藏夹"列表中的项目.因此,当我在LinksDetails页面中单击AddItem或RemoveItem时,我希望该项目被删除或添加到收藏夹页面"列表中.在我仅依靠OnAppearing发挥其魔力并更新收藏夹"列表之前,但是从列表中删除该项目会比较滞后,因此我希望这种方法将在偶数被调用时立即删除或添加,而不是在页面在OnAppearing上加载.但是,我认为我不是正确地调用了事件,或者我的订阅者未正确订阅.活动和代表从一开始就让我感到困惑.在我的收藏夹列表最上面进行了分组,这也是我第一次使用分组列表.查看我的代码:
I would like to add or remove an item on the my Favorites list seamlessly. So when I click on the AddItem or RemoveItem in the LinksDetailsPage I would like the item to either remove or add to theFavoritesPage List. Before I was only relying on the OnAppearing to work its magic and update the favorites list but it would lag to remove the item from the list, so this way I hope it would remove or add as soon as the even is invoked and not when the page loads on OnAppearing. However I think I am either not invoking the event properly or my subscriber is not subscribed properly. Events and delegates have been confusing for me from the get go. On top of that my favorites list is grouped so and it's my first time working with grouped lists as well. Check out my code:
订户我的收藏夹页面:
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
}
到目前为止,我还没有访问任何内容.
I am not accessing anything so far.
发布者LinksDetailsPage:
Publisher LinksDetailsPage:
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);
}
有人可以指导我如何使此均匀过程正常工作吗?
Can someone guide me on how to make this even process work?
推荐答案
- 如果要使用事件,则应声明 LinksDetailsPage ,如下所示:
If want to use Events, LinksDetailsPage should be declared something like following:
public partial class LinksDetailsPage : ContentPage { public event EventHandler<NewspaperLink> ItemAdded; public event EventHandler<NewspaperLink> ItemDeleted; public LinksDetailsPage() { InitializeComponent(); } protected virtual void AddLink(NewspaperLink e) { EventHandler<NewspaperLink> handler = ItemAdded; if (handler != null) { handler(this, e); } } protected virtual void DeleteLink( NewspaperLink e) { EventHandler<NewspaperLink> handler = ItemDeleted; if (handler != null) { handler(this, e); } } // Add click event private void Add_Clicked(object sender, EventArgs e) { AddLink(new NewspaperLink() {link="first link" }); } // Delete click event private void Delete_Clicked(object sender, EventArgs e) { DeleteLink(new NewspaperLink() { link = "first link" }); } } public class NewspaperLink : EventArgs { public string link { get; set; } }
然后,当导航到 LinksDetailsPage 页面时,您需要在 ListView页面中进行订阅:
Then you need to subscribe it in the ListView page when navigating to the LinksDetailsPage page:
private async void Button_Clicked(object sender, EventArgs e) { LinksDetailsPage detailPage = new LinksDetailsPage(); detailPage.ItemAdded += DetailGridPage_ItemAdded; detailPage.ItemDeleted += DetailGridPage_ItemDeleted; await Navigation.PushModalAsync(detailGridPage); } private void DetailGridPage_ItemDeleted(object sender, NewspaperLink e) { Console.WriteLine("The tlink was deleted : " + e.link); } private void DetailGridPage_ItemAdded(object sender, NewspaperLink e) { Console.WriteLine("The link was added : "+e.link); }
- 委托
类似地,如果要使用委托",则只需在列表页面中声明以下内容:
Similarly, if want to use Delegate, you only need to declare something in List Page as follows:
public partial class ListViewPage : ContentPage { public delegate void ItemAddedDelegate(NewspaperLink e); public delegate void ItemDeletedDelegate(NewspaperLink e); public ListViewPage() { InitializeComponent(); } private async void Button_Clicked(object sender, EventArgs e) { ItemAddedDelegate itemAddedDelegate = AddMethod; ItemDeletedDelegate itemDeletedDelegate = DeleteMethod; DetailGridPage detailGridPage = new DetailGridPage(itemAddedDelegate, itemDeletedDelegate); await Navigation.PushModalAsync(detailGridPage); } public static void AddMethod(NewspaperLink item) { Console.WriteLine("Add" + item.link); } public static void DeleteMethod(NewspaperLink link) { Console.WriteLine("Delete" + item.link); } }
然后在 LinksDetailsPage 中,您可以将
add
或delete
委托方法传递给 ListViewPage .Then in LinksDetailsPage, you can pass the
add
ordelete
delegate method to ListViewPage.public partial class LinksDetailsPage : ContentPage { private ListViewPage.ItemAddedDelegate itemAddedDelegate; private ListViewPage.ItemDeletedDelegate itemDeletedDelegate; public DetailGridPage() { InitializeComponent(); } public LinksDetailsPage(ListViewPage.ItemAddedDelegate itemAddedDelegate, ListViewPage.ItemDeletedDelegate itemDeletedDelegate) { InitializeComponent(); this.itemAddedDelegate = itemAddedDelegate; this.itemDeletedDelegate = itemDeletedDelegate; } // Add click event private void Add_Clicked(object sender, EventArgs e) { itemAddedDelegate(new NewspaperLink() { link = "first link" }); } // Delete click event private void Delete_Clicked(object sender, EventArgs e) { itemDeletedDelegate(new NewspaperLink() { link = "first link" }); } } public class NewspaperLink : EventArgs { public string link { get; set; } }
- MessageCenter
如果使用 MessageCenter ,它应该是实现该目标的最佳便捷方法.
If using MessageCenter, it should be the best convenient method to achieve that.
在 ListView页面中仅
Subscribe
:public ListViewPage() { InitializeComponent(); MessagingCenter.Subscribe<object, NewspaperLink>(this, "Add", async (sender, arg) => { await DisplayAlert("Message received", "arg=" + arg.link, "OK"); }); MessagingCenter.Subscribe<object, NewspaperLink>(this, "Delete", async (sender, arg) => { await DisplayAlert("Message received", "arg=" + arg.link, "OK"); }); }
并在 LinksDetailsPage 中发送消息,如下所示:
And send message in LinksDetailsPage as follows:
// Add click event private void Add_Clicked(object sender, EventArgs e) { NewspaperLink newspaperLink= new NewspaperLink() { link = "first link" }; MessagingCenter.Send<object, NewspaperLink>(this, "Add", newspaperLink); } // Delete click event private void Delete_Clicked(object sender, EventArgs e) { NewspaperLink newspaperLink = new NewspaperLink() { link = "first link" }; MessagingCenter.Send<object, NewspaperLink>(this, "Delete", newspaperLink); }
这篇关于Xamarin中的事件和委托构成父页面和子页面的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!