Хорошо, так что этому вопросу уже почти 6 лет, и я до сих пор не могу найти здесь, что я думаю, что это правильный ответ, поэтому позвольте мне поделиться своими "2 центами" ...
На самом деле у меня есть 2 способа сделать это, первый простой ... второй справа, поэтому , если вы ищете правильный, просто пропустите # 1 и перейдите к # 2
1. Быстро и легко (но не полностью)
Если у меня небольшой проект, я иногда просто создаю CloseWindowAction в ViewModel:
public Action CloseWindow { get; set; } // In MyViewModel.cs
И кто бы ни создал View, или в коде View, я просто установил метод, который будет вызывать действие:
(помните, что MVVM относится к разделению View и ViewModel ... Код представления здесь все еще является View и до тех пор, пока существует правильное разделение, вы не нарушаете шаблон)
Если какой-то ViewModel создает новое окно:
private void CreateNewView()
{
MyView window = new MyView();
window.DataContext = new MyViewModel
{
CloseWindow = window.Close,
};
window.ShowDialog();
}
Или, если вы хотите, чтобы это было в вашем главном окне, просто поместите его под конструктор вашего представления:
public MyView()
{
InitializeComponent();
this.DataContext = new MainViewModel
{
CloseWindow = this.Close
};
}
когда вы хотите закрыть окно, просто вызовите Action на вашей ViewModel.
2. Правильный путь
Теперь правильный способ сделать это - использовать Prism (ИМХО), и все об этом можно найти здесь .
Вы можете сделать Запрос на взаимодействие , заполнить его любыми данными, которые вам понадобятся в новом окне, пообедать, закрыть и даже получить данные обратно . Все это инкапсулировано и одобрено MVVM. Вы даже получаете статус того, как было закрыто Окно , например, если Пользователь Canceled
или Accepted
(кнопка ОК), Окно и данные возвращаются, если вам это нужно . Это немного сложнее, ответ № 1, но он намного более полный и рекомендуемый шаблон от Microsoft.
Ссылка, которую я дал, содержит все фрагменты кода и примеры, так что я не стану размещать здесь какой-либо код, просто прочитайте статью о загрузке Prism Quick Start и запустите ее, ее очень просто понять немного более подробный, чтобы заставить его работать, но преимущества больше, чем просто закрытие окна.