从卸载的页面触发的事件

时间:2018-06-10 17:41:08

标签: c# wpf xaml uwp

在我的UWP应用程序中,我有2个页面都有自定义ListView的实例。当第一页从Frame中卸载时,第二页立即加载到它中。此外,两个Pages中的ListView都有一个SelectionChanged事件,该事件是x:Binded到位于MainViewModel中的事件处理程序。和我一起到目前为止?

当我从一个页面导航到另一个页面然后在ListView中选择项目时,会出现问题。不知何故,SelectionChanged事件获得两次调用。我开始意识到卸载页面中的ListView也触发SelectionChanged事件,即使我不在该页面上,因此,我没有在该页面上选择任何项目!奇怪的。希望我在这里有所作为。

    <!-- Page1.xaml -->
    <TemplatedControls:MyListView x:Name="MyListView"
                                  SelectionChanged="{x:Bind MainViewModel.MyListView_SelectionChanged}">
    </TemplatedControls:MyListView>

    <!-- Page2.xaml -->
    <TemplatedControls:MyListView x:Name="MyListView"
                                  SelectionChanged="{x:Bind MainViewModel.MyListView_SelectionChanged}">
    </TemplatedControls:MyListView>

1 个答案:

答案 0 :(得分:1)

  

我现在已经知道垃圾收集器运行后这个问题就消失了,并释放了以前的Page资源或其他什么。但这仍然很奇怪,我想知道处理这个问题的最有效方法。

这实际上是预期的行为。当您使用弱事件模式订阅事件时(如UWP显然那样),事件处理将继续,直到垃圾收集器收集侦听器:https://docs.microsoft.com/en-us/dotnet/framework/wpf/advanced/weak-event-patterns

如果您希望能够准确控制何时取消订阅该活动,您可以覆盖On​Navigating​From方法并明确取消订阅:

public partial class Page1 : Page
{
    public Page1()
{
    InitializeComponent();
    MyListView.SelectionChanged += MainViewModel.MyListView_SelectionChanged;
}
    ...

    protected override void OnNavigatingFrom(NavigatingCancelEventArgs e)
    {
        base.OnStartup(e);
        MyListView.SelectionChanged -= MainViewModel.MyListView_SelectionChanged;
    }
}