C# 从已卸载页面触发的事件

C# 从已卸载页面触发的事件,c#,wpf,xaml,uwp,C#,Wpf,Xaml,Uwp,在我的UWP应用程序中,我有两个页面,它们都有一个自定义ListView的实例。当第一页从框架中卸载时,第二页立即加载到框架中。另外,两个页面中的ListView都有一个SelectionChanged事件,该事件是x:bind到位于MainViewModel中的事件处理程序的。到目前为止和我在一起 当我从一个页面导航到另一个页面,然后在ListView中选择项目时,就会出现问题。不知何故,SelectionChanged事件会收到两次调用。我开始意识到,卸载页面中的ListView也在触发Se

在我的UWP应用程序中,我有两个页面,它们都有一个自定义ListView的实例。当第一页从框架中卸载时,第二页立即加载到框架中。另外,两个页面中的ListView都有一个SelectionChanged事件,该事件是x:bind到位于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>


我现在了解到,在垃圾收集器运行并释放上一个
页面的资源或其他资源后,这个问题就消失了。但这仍然很奇怪,我想知道处理这个问题的最有效方法

这实际上是预期的行为。当您使用弱事件模式订阅事件时(显然与UWP类似),事件处理将继续进行,直到垃圾收集器收集侦听器:

如果您希望能够准确地控制何时取消订阅活动,您可以覆盖上的
​航行​从
方法和明确取消订阅:

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;
    }
} 

我现在了解到,在垃圾收集器运行并释放上一页的资源或其他内容后,这个问题就消失了。但这仍然很奇怪,我想知道处理这个问题的最有效的方法。我创建了两个绑定相同
viewmodel
的页面。但我无法复制你的问题。你能分享一个简单的示例吗?我同意这是一个解决方案,但它仍然没有解释为什么列表视图控件的不同实例会执行该方法两次。当您对列表视图的不同实例进行数据绑定
SelectionChanged
时,为什么该特定列表视图会触发该方法?我打赌会有一些
x:Bind
magic在引擎盖下,但我现在没看到。