Вопрос

В моем приложении у меня есть 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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top