Лучший способ закрыть окно с mefedmvvm
Вопрос
В моем приложении у меня есть Mainwindow, который импортирует Mefedmvvm The ViewModel:
xmlns:mefed="clr-namespace:MEFedMVVM.ViewModelLocator;assembly=MEFedMVVM.WPF"
mefed:ViewModelLocator.ViewModel="MainViewModel"
И теперь у меня тоже есть моя просмотра, которая осознает ViewModel:
[ExportViewModel("MainViewModel")]
public class MainViewModel: ViewModelBase
В моем ViewModel у меня есть свойство Icommand для закрытия окна. Мероприятие для закрытия банки приходит из любого места. И с помощью Cinch Framework 2.0 я осознаю проста с помощью метода выполнения.
Вопрос
Как я могу закрыть окно из моего выполнения метода? За инъекцией зависимостей у меня нет конструктора, я не могу зарегистрировать событие или дать представление в качестве параметра для ViewModel.
Редактировать
Однако возможность, которая, я думаю, не хороша:
Назовите это в методе
Application.Current.MainWindow.Close()
Решение
Вы можете достичь этого, написав ICommand
это проходит Window
экземпляр в как параметр.
Хороший пример доступен здесь: Как я могу назначить поведение «Закрыть нажатие на ключ» на все окна WPF в проекте?
В этом посте ICommand
в конечном итоге связан KeyBinding
(чтобы клавиша Escape можно было использовать для закрытия окна), но вы сможете связать команду с любой кнопкой или вызвать ее из любой точки зрения. Важной частью является использование RelativeSource
При привязке параметра вашей команды для ссылки Window
что вы хотите закрыть
Изменить в ответ на комментарии
Команда - это синглтон, но для этого не требуется, чтобы это было всего лишь синглтон, потому что оно без сохранения состояния, и это облегчает привязку. Он приобретает ссылку на Window
через переплет, поэтому для UserControl
Вы можете просто использовать:
<Button Command="{x:Static mynamespace:CloseWindowCommand.Instance}"
CommandParameter="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=Window}}" Content="Close My Parent Window" />
Иметь возможность называть его из кода модели просмотра немного более сложным и нуждается в другом подходе; Хороший пример можно найти здесь: http://gallery.expression.microsoft.com/windowclosebehavior