Как поменять вид изнутри вида? - PullRequest
8 голосов
/ 29 февраля 2012

Я создаю приложение WPF, использующее легкую инфраструктуру MVVM.

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

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

Любой совет?

Ответы [ 2 ]

8 голосов
/ 29 февраля 2012

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

Если перед входом в приложение требуется одноразовое окно входа, я добавлю его в метод 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 Prism EventAggregator, поэтому он может прослушивать сообщения определенного типа, такие как OpenWindow или CloseWindow.Если вам интересно, у меня есть пост в блоге о Связи между ViewModels , который должен дать вам лучшее представление о том, как выглядит система событий.

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

3 голосов
/ 29 февраля 2012

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

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

...