导航后未放置ViewModel实例

时间:2018-02-27 08:23:02

标签: c# uwp prism

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

摄制:

  1. 执行申请
  2. 在Test1和Test2之间多次导航
  3. 点击" RaiseEvent"用于执行全局事件
  4. 记录其哈希码的所有实例
  5. 应用程序应该在某些时候崩溃

1 个答案:

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