如何解决页面消失后如何取消订阅事件
从显示 DATA 的页面的 viewmodel 中,我需要显示一个 SecondaryPage,其中包含这些 DATA 的子集。因此,当单击按钮时,我将过滤器应用于 DATA 并调用 SecondaryPage。当第二页消失时,我通过回调来重置过滤器:
private async Task levelClickedAction(object arg)
{
var level = arg as Observable<string>;
if (level == null) return;
// Unselect the clicked item
LevelClicked = null;
isHidden = true; // Prevent from updating primary page
// Apply filter to the data
wordDictionary.SetReviewPlanFilter( Reviews.IndexOf(level) );
// Create secondary page,setup callback and display it
var page = new SecondaryPage();
page.OndisappearingEvent += ResertFilters;
await Application.Current.MainPage.Navigation.PushModalAsync(new NavigationPage(page));
}
private void ResetFilters(object sender,object e)
{
isHidden = false;
wordDictionary.ResetReviewPlanFilter();
}
我的问题是:
- 我是否需要取消订阅 OndisappearingEvent 以确保 SecondaryPage 是否正确处理?看起来,是的,我这样做是因为处理程序的强引用和我主页的更长生命周期。对吗?
- 那么如何去做,何时何地?
我尝试在 .ContinueWith()
之后使用 PushModalAsync(new NavigationPage(page))
但它立即被触发...
问题在于,在 ResetFilters 过程中,我不再知道该页面......我可以创建一个字段而不是 var 页面:
private WordList page;
...
private void ResetFilters(object sender,object e)
{
isHidden = false;
page.OndisappearingEvent -= ResetFilters;
page = null;
wordDictionary.ResetReviewPlanFilter();
}
但它看起来很丑......有没有更漂亮/更直接的方法?
感谢您的建议。
解决方法
好的,我找到了一个更好的方法,这是我一直在寻找的。不需要适配目标SecondPage
我为我的 ViewModel 创建了一个接口:
public interface IReturnCallback
{
Action OnReturnCallback {get; set; }
}
我像这样修改了我的调用页面的 .xaml.cs 文件:
protected override void OnAppearing()
{
// Invoke callback if any
((IReturnCallback)BindingContext)?.OnReturnCallback?.Invoke();
base.OnAppearing();
}
因此,每当我从一页返回时必须执行代码时,我都会在 OnReturnCallback 中分配它,以便像这样调用 SecondaryPage :
private async Task levelClickedAction(object arg)
{
var level = arg as Observable<string>;
if (level == null) return;
// Unselect the clicked item
LevelClicked = null;
isHidden = true; // Prevent from updating primary page
// Apply filter to the data
wordDictionary.SetReviewPlanFilter( Reviews.IndexOf(level) );
// Create secondary page,setup callback and display it
if (page == null) page = new WordList();
OnReturnCallback = () => {
isHidden = false;
wordDictionary.ResetReviewPlanFilter();
OnReturnCallback = null;
};
await Application.Current.MainPage.Navigation.PushModalAsync(new NavigationPage(page));
}
不要忘记重置 OnReturnCallback,这样它只会被调用一次。
有什么意见吗?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。