2012-02-28 5 views
7

Я делаю приложение WPF, используя фреймворк MVVM.Как переключить представления из представления?

Что я пытаюсь сделать, так это иметь форму входа в систему, когда пользователь нажимает кнопку в этом представлении, запускает LoginCommand для присоединенного ViewModel. Оттуда я либо хочу запустить новое окно, которое содержит остальную часть приложения, либо просто переключить представления из того же окна.

В настоящее время у меня есть так, что есть представление под названием MainView, у которого есть элемент управления содержимым внутри, связанный с View1. Однако, чтобы переключиться на View2, мне нужно поместить кнопку для этого в MainView, а не в View1, где он принадлежит.

Любые советы?

ответ

7

Обычно я делаю это один из двух способов:

Если окно Логин является одноразовым, что требуется перед запуском приложения, я положу его в OnStartup() способе Application объекта

protected override void OnStartup(StartupEventArgs e) 
{ 
    base.OnStartup(e); 

    // Login 
    var login = new LoginDialog(); 
    var loginVm = new LoginViewModel(); 

    login.DataContext = loginVm; 
    login.ShowDialog(); 

    if (!login.DialogResult.GetValueOrDefault()) 
    { 
     // Error is handled in login class, not here 
     Environment.Exit(0); 
    } 

    // If login is successful, show main application 
    var app = new ShellView(); 
    var appModel = new ShellViewModel(); 

    app.DataContext = viewModel; 
    app.Show(); 
} 

Другим способом я обычно делаю это через ShellViewModel или ApplicationViewModel, который обрабатывает все мое управление окном. Этот метод использует DataTemplates для определения каждого экрана и использует ContentControl в качестве заполнителя для текущего экрана в ShellView или ApplicationView.

Я обычно совмещаю это с системой событий какого-то, как Microsoft призмы EventAggregator, так что он может прослушивать сообщения определенного типа, например OpenWindow или CloseWindow сообщений. Если вам интересно, у меня есть сообщение в блоге о Communication between ViewModels, которое должно дать вам лучшее представление о том, как выглядит система событий.

Например, мой ShellViewModel может начать отображение LoginViewModelDataTemplate используется, чтобы сказать WPF, чтобы сделать LoginViewModel с LoginView), и он будет получать, подписавшись на сообщения типа SuccessfulLogin. Как только LoginViewModel будет транслировать сообщение SuccessfulLogin, ShellViewModel закроет LoginViewModel и заменит его на ApplicationViewModel. Вы можете увидеть пример этого в моей статье по адресу Navigation with MVVM

+0

Это похоже на хороший способ его достижения. Разве нет проблемы с помещением этой функции в код позади, в отличие от модели представления? – benjgorman

+1

@benjgorman Шаблон проектирования MVVM предназначен для того, чтобы код кода и кода приложения был раздельным, и я рассматриваю код класса 'Application' как волшебную область между ними, так как он должен инициализировать как пользовательский интерфейс, так и объекты приложения запустите приложение. Честно говоря, я редко имею более одного окна в своем приложении. Я предпочитаю использовать 'DataTemplates' и' ContentControls' для управления текущим контентом. Вы можете увидеть пример этого [здесь] (http://rachel53461.wordpress.com/2011/12/18/navigation-with-mvvm-2/) – Rachel

+0

В вашем ответе эта часть вызывает у него головные боли. 'if (! Login.DialogResult.GetValueOrDefault()) { // Ошибка обрабатывается в классе входа, а не здесь Environment.Exit (0); } ' Как связать это с ICommand? Я попытался использовать IPropertyChangedEvent, но он срабатывает до появления окна входа в систему. – benjgorman

2

Поместите свои взгляды внутри Page элементов, внутри вашего MainWindow создайте рамку и укажите ее источник на первую страницу.

С этого момента вы можете использовать рамку NavigationService, чтобы перемещаться по кадру на другой вид, подобно веб-браузеру.

Смежные вопросы