#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