Фонд MVVM: как закрыть окно приложения из ViewModel - PullRequest
2 голосов
/ 25 сентября 2010

Я использую MVVM Foundation , но я думаю, что это довольно просто и не совсем зависит от фреймворка. Моя установка выглядит следующим образом:

  • StartViewModel - имеет команду ExitCommand, которая возвращает RelayCommand / ICommand

    public ICommand ExitCommand {
        get { return _exitCommand ?? (_exitCommand = new RelayCommand(() => MessageBox.Show("Hello World"))); }
    }
    public RelayCommand _exitCommand;
    
  • StartView (пользовательский элемент управления) имеет кнопку, связанную с командой ExitCommand

    <Button Content="Exit" Command="{Binding ExitCommand}" />  
    

Ответы [ 2 ]

3 голосов
/ 25 сентября 2010

Во-первых, прочитайте столько, сколько сможете на MVVM, например, Приложения WPF с шаблоном проектирования Model-View-ViewModel в MSDN. Когда вы поймете основные принципы, лежащие в его основе, ответ будет более разумным.

По сути, вы хотите, чтобы ваши слои View (UI) и ViewModel (по существу абстрактный UI, но также и абстрактная модель) отделялись и были развязаны. Отображение окна сообщения или закрытие окна должно рассматриваться как деталь, специфичная для пользовательского интерфейса, и, следовательно, реализовано в представлении или, в случае окна сообщения, более общедоступным через «Сервис».

Что касается ViewModel, это достигается с помощью Инверсия управления (IoC). Возьмите пример окна сообщения выше. Вместо того, чтобы показывать само окно сообщения, оно берет зависимость от IMessageBoxService, у которого есть метод Show, а ViewModel вызывает это вместо этого - делегируя ответственность. Этого можно добиться, используя контейнеры Dependency Injection (DI).

Другой подход, используемый для закрытия окна View, может состоять в том, чтобы ViewModel представлял событие, называемое, например, RequestClose (как в статье MSDN), на которое подписывается View. Затем ViewModel вызовет событие, когда захочет закрыть соответствующий вид / окно; он предполагает, что что-то еще слушает, и возьмет на себя ответственность и фактически сделает это.

1 голос
/ 25 сентября 2010

вы можете реализовать CloseEvent в вашей StartViewModel.в вашем StartView вы должны зарегистрировать это CloseEvent.когда вы поднимаете свой closeevent с вашей виртуальной машины, тогда ваш View распознает, что он должен закрыть ваше приложение / окно.

...