Prism WPF закрывает представление и удаляет автоматически подключенную ViewModel

#c# #wpf #prism

#c# #wpf #prism

Вопрос:

Короче говоря, поведение, которое я хочу выполнить, — это LOGIN-> LOGOUT-> LOGIN

Мое приложение запускается с видом входа в систему. После аутентификации он закрывается и открывается MainView:

 public void Authenticated(){
    MainWindow main = new MainWindow();
    main.Show();
    if (Application.Current.Windows.Count > 1) {
        Application.Current.Windows[0].Close();
    }
    this.CloseAction();
}
  

CloseAction — это просто переменная действия, которая закрывается из кода следующим образом

 public partial class MainWindow : Window {
    public MainWindow() {
        InitializeComponent();
        if ( (this.DataContext as MainWindowViewModel)!.CloseAction == null )
            (this.DataContext as MainWindowViewModel)!.CloseAction = new Action(this.CloseH);
    }

    private void CloseH() {
        this.Close();
    }
}
  

Мои основные компоненты также содержат две области просмотра, удаленные из логики MainViewViewModel (ЭТИ ДВЕ ЯВЛЯЮТСЯ USERCONTROLS)

 _regionManager.RegisterViewWithRegion("FileTreeRegion", typeof(FileTree));
_regionManager.RegisterViewWithRegion("FileDetailsRegion", typeof(FileDetails));
  

В какой-то момент, если мне нужно выйти из системы, я запускаю функцию

 public void Logout(){
   Login login = new Login();
   login.Show();
   if (Application.Current.Windows.Count > 1) {
       Application.Current.Windows[0].Close();
   }
   this.CloseAction();
   // _eventAggregator.GetEvent<AppMessageLogout>().Publish();
   // _regionManager.Regions.ToList().ForEach((r) => r.RemoveAll());
}
  

Но когда я повторяю попытку входа в систему, мои viewmodels viewmodels (usercontrols FileTree и FileDetails) вызываются два раза (отладка метода конструктора).
Ранее прокомментированные строки представляют собой две безуспешные попытки решить проблему:

  • используя команду публикации / подписки с одноразовым в UserControl (я удалил только команды register в viewmodel, поскольку в UserControl нет a Close() )
  • удаление всех представлений в RegionManager, чтобы избежать сбора мусора. Хотя, я думаю, это бесполезно, поскольку, как я читал в Интернете, родительское окно представлений является основным окном, и когда оно закрывается, представления также

Все ViewModels автоматически подключаются к Prism в файлах xaml.

Комментарии:

1. В чем проблема? Это не имеет смысла … удаление представлений требуется, чтобы сделать их пригодными для сборки мусора.

2. разве представления не привязаны к MainWindow? поэтому, когда я закрываю main, представления также исчезают… Однако проблема (двойной вызов конструкторов) остается … обе строки являются неудачными попытками, а не решениями

3. Здесь недостаточно информации, чтобы воспроизвести проблему. Но взгляните на навигацию Prism. Вместо того, чтобы просто регистрировать свой вид в region, посмотрите на регистрацию своего вида для навигации. Это должно избежать двойного вызова конструктора. Взгляните на это — youtube.com/watch?v=anoK10sSPvE