UWP应用程序(Prism.Unity NuGetPackage 6.3.0)
当多次导航到同一页面时,会创建一个新的视图模型实例,旧的实例将保存在内存中并且不会被丢弃。
这会导致崩溃,因为全局事件会使用事件聚合器多次触发,也会被侦听它的旧ViewModel接收。
我们正在使用NavigationService浏览网页。我们的页面和用户控件绑定到XAML中带有git fetch && git checkout master
git pull
的视图模型。
我们已经看到一些关于类似问题的线索,解决方案是使用Regions添加区域行为。但是,据我所知,Prism UWP在当前版本中并不支持区域。
我们认为问题与ViewModelLocator和NavigationService有关,因为使用Container.RegisterType注册viewmodels并使用不同的LifetimeManager无效。
可以从GitHub下载崩溃的样本:App1.zip
摄制:
答案 0 :(得分:1)
这会导致崩溃,因为全局事件会使用事件聚合器多次触发,也会被侦听它的旧ViewModel接收。
当您从一个页面导航到另一个页面时,您可以取消订阅该事件。
例如:
public class Test1PageViewModel : ShellIntegratedViewModel
{
private readonly IEventAggregator _eventAggregator;
private readonly INavigationService _navigationService;
Action action;
public Test1PageViewModel(IEventAggregator eventAggregator, INavigationService navigationService)
: base(eventAggregator)
{
_eventAggregator = eventAggregator;
_navigationService = navigationService;
NavigateCommand = new DelegateCommand(OnNavigateCommand);
action = new Action(()=> {
_eventAggregator.GetEvent<LogEvent>().Publish("Test1 Hashcode: " + this.GetHashCode());
});
_eventAggregator.GetEvent<TestEvent>().Subscribe(action);
}
private void OnNavigateCommand()
{
_eventAggregator.GetEvent<TestEvent>().Unsubscribe(action);
_navigationService.Navigate("Test2", null);
}
public DelegateCommand NavigateCommand { get; private set; }
}