微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

页面消失后如何取消订阅事件

如何解决页面消失后如何取消订阅事件

显示 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 举报,一经查实,本站将立刻删除。