Как поменять вид изнутри вида?

Я делаю приложение WPF с использованием легкого фреймворка MVVM.

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

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

Любой совет?

Ответы на вопрос(2)

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

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

Решение Вопроса

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

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

 benjgorman28 февр. 2012 г., 21:38
Это кажется хорошим способом для достижения этого. Нет ли проблемы в размещении этой функциональности в коде, в отличие от модели представления?
 Rachel29 февр. 2012 г., 18:55
@benjgorman TheLoginButton который существует наLoginView связан с командой вLoginViewModel, Я должен был бы посмотреть, как именно я все это подключил, но если вход был успешным,LoginView.DialogResult получил наборtrue, Если нет, он был установлен вfalse, настройкаthis.DialogResult вLoginView заставил окно закрыться автоматически и вернутьDialogResult тому, кто звонил.ShowDialog()
 Rachel28 февр. 2012 г., 21:58
@benjgorman Шаблон проектирования MVVM предназначен для разделения кода пользовательского интерфейса и кода приложения, и я рассматриваю код, стоящий заApplication Класс как магическая область между ними, поскольку для запуска приложения требуется инициализация как пользовательского интерфейса, так и объектов приложения. Честно говоря, у меня редко бывает более 1 окна в моем приложении. Я предпочитаю использоватьDataTemplates а такжеContentControls для управления текущим контентом. Вы можете увидеть пример этогоВот
 benjgorman29 февр. 2012 г., 16:12
В вашем ответе эта часть вызывает у него головную боль.if (!login.DialogResult.GetValueOrDefault()) { // Error is handled in login class, not here Environment.Exit(0); } Как мне связать это с ICommand? Я попытался использовать IPropertyChangedEvent, но он срабатывает до того, как появится окно входа.
 Brian J13 дек. 2015 г., 23:24
@Rachel Я устал от вышесказанного, используя ваш первый пример, и мне кажется, что я пропустил шаг в app.xaml.cs, так как диалоговое окно входа не закрывается после успешного входа. есть идеи? Я сделал суть из трех связанных классов: gist.github.com/BrianJVarley/44c74ab0663abe3cacb4 Я также сделал вопрос об этом:stackoverflow.com/questions/34257105/...

Ваш ответ на вопрос