在我的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>
答案 0 :(得分:1)
我现在已经知道垃圾收集器运行后这个问题就消失了,并释放了以前的
Page
资源或其他什么。但这仍然很奇怪,我想知道处理这个问题的最有效方法。
这实际上是预期的行为。当您使用弱事件模式订阅事件时(如UWP显然那样),事件处理将继续,直到垃圾收集器收集侦听器:https://docs.microsoft.com/en-us/dotnet/framework/wpf/advanced/weak-event-patterns
如果您希望能够准确控制何时取消订阅该活动,您可以覆盖OnNavigatingFrom
方法并明确取消订阅:
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;
}
}