Я боролся с этим и нашел ответ, написанный @ mm8, очень полезным, а также несколько других постов. Я не был в восторге от идеи создания класса (или метода внутри класса) для каждого представления, поэтому я создал свой собственный вариант. Это один из моих первых проектов с WPF, когда я пытался использовать MVVM, поэтому я поделюсь этим, если это будет полезно, а также чтобы получить отзывы от более опытных людей.

опрос связан с тем, что создано тысяча и одна тема, и если я пропущу ответ на свой вопрос, извините, но, насколько я посмотрел, никто не мог ответить на мой вопрос. Например:Открытие нового окна в MVVM WPF

Ответы хороши, если вы используете только один проект WPF (включая модели, vms и представления), но так как я учусь правильно реализовывать MVVM (и я неоднократно читал, что лучше всего создавать отдельный класс lib). (dll) для модели, viewmodel и отдельного проекта графического интерфейса), который, кажется, не работает в моих глазах, потому что, если я хочу создать интерфейс, такой как IWindowService (описанный в предыдущем URL, а такжеВот, Невозможно получить доступ к классу Window или Control, потому что тогда у меня должна быть ссылка на проект GUI, и вся цель шаблона разрушена.

Поэтому мой вопрос заключается в том, как показать новое окно (с новой моделью представления), например, из MainViewModel, соблюдая при этом слабосвязанные принципы MVVM И отдельные проекты.

Более подробно пример того, чего я пытаюсь достичь:

У меня есть следующая структура:

МОДЕЛЬ (проект dll)
Профиль

ViewModel (проект dll)
MainViewModel
AddProfileViewModel

ВИД (WPF) (exe проект)
MainWindow
AddProfileWindow

Я открываю MainWindow и хочу нажать кнопку AddProfile, затем AddProfileWindow должен появиться с прикрепленной к нему AddProfileViewModel.

 Shcherban17 нояб. 2017 г., 15:28
Вы можете использоватьMessenger отправить некоторыеOpenWindow сообщение и подписаться на него в проекте Viewstackoverflow.com/questions/16993918/...
 JC9717 нояб. 2017 г., 15:50
Я посмотрел на Мессенджер, но это кажется немного излишним. Это кажется полезным для связи между моделями представления, так что +1 для этого

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

Решение Вопроса
ОпределитеIWindowService Интерфейс в модельном проекте.Ссылка на модельный проект из представления модельного проекта.РеализоватьIWindowService в проекте приложения WPF (просмотр).

Затем кнопка должна быть связана сICommand который используетIWindowService открыть окно. Что-то вроде этого:

public class MainWindowViewModel
{
    private readonly IWindowService _windowService;

    public MainWindowViewModel(IWindowService windowService)
    {
        _windowService = windowService;
        AddProfile = new DelegateCommand(() =>
        {
            _windowService.OpenProfileWindow(new AddProfileViewModel());
        });
    }

    public ICommand AddProfile { get; }
}

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        DataContext = new MainWindowViewModel(new WindowService());
    }
}

public class WindowService : IWindowService
{
    public void OpenProfileWindow(AddProfileViewModel vm)
    {
        AddProfileWindow win = new AddProfileWindow();
        win.DataContext = vm;
        win.Show();
    }
}

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