Закрыть команду WPF - PullRequest
       1

Закрыть команду WPF

2 голосов
/ 01 июня 2011

Я только начал изучать WPF. В настоящее время у меня в главном окне есть файл MenuItem -> EXIT.

Я хочу знать, как мне добавить функциональность к пункту меню выхода. На мой взгляд, есть 3 основных варианта

1) Добавьте обработчик событий к событию Click элемента Exit. Затем закодируйте обработчик событий в коде окна

2) Добавьте команду «Закрыть» в пункт «Выход» и добавьте привязку в главном окне, которое обрабатывает команду. Опять же, это включает в себя добавление кода в код окна позади.

3) Добавьте команду Exit menuItem, которая вызывает метод в ViewModel. Это удаляет код из кода представлений позади, но означает, что ViewModel должна содержать ссылку на представление.

Какой подход лучше всего подходит для этой ситуации?

Я не хочу зацикливаться на том, чтобы вообще не вставлять какой-либо код в кодовый объект Views. Однако, поскольку это только действие, включающее представление, возможно, метод 1 или 2 будет лучшим. Какие-нибудь мысли?

Ответы [ 3 ]

2 голосов
/ 02 июня 2011

Ну, я столкнулся с точно таким же сценарием, и вот что я сделал:

  • Поскольку я использую MVVMLight Toolkit, следовательно, все ViewModel создаются в централизованном месте, то есть ViewModelLocator. Этот класс также содержит статические свойства, с помощью которых вы можете получить доступ к этим моделям представления.

  • Следовательно, я объявил событие в модели представления следующим образом:

    public event EventHandler RequestClose;
    
  • Далее я представил реализацию в файле с выделенным кодом, из которого я открываю ассоциированное представление viewmodel следующим образом:

    var view = new NewView();
    view.Owner = this;
    ViewModelLocator.NewViewViewModelStatic.RequestClose += (s, e) => { view.Close(); };
    
  • Теперь, когда мне нужно было закрыть представление от модели представления, я бы просто позвонил:

    RequestClose(this, new EventArgs());
    

Надеюсь, это поможет. Пожалуйста, дайте мне знать, если у вас есть путаница.

1 голос
/ 02 июня 2011

Если это базовая команда Exit, я не вижу проблем в том, чтобы поместить ее в код позади.

Если вы начнете хотеть выполнять другой код во время выхода, чем я бы поместил ваш код выхода в ViewModelгде-нибудь и привязать к нему, или использовать что-то вроде Messenger класса MVVM Light или EventAggregator Prism, чтобы поднять CloseApplicationEvent, чтобы другие объекты могли обрабатывать себя во время выключения.

1 голос
/ 01 июня 2011

Как? К сожалению, нет четкого выбора с этим.

Что касается первых двух опций, то можно сказать, что обработка закрытия представления является целью представления, поэтому использование codebehind приемлемо. Вы можете сделать это с помощью кнопки , установив для свойства IsCancel значение true. Это закрывает окно, и если вам не нужно обрабатывать закрытие из ViewModel , это прекрасно.

Что касается третьего варианта, я сделал это, привязав CommandArgument к самому окну . ICommand получает Window в качестве аргумента в методе Execute . С помощью этой ICommand вы можете обрабатывать все, что вам нужно, в ViewModel и закрывать окно .

.

Это хорошо или плохо? Ну, некоторые пуристы могут утверждать, что это ставит зависимость от ViewModel , которая нарушает совместимость с другими типами представлений. Практически я думаю, что это хорошо. Вы можете заниматься художественной гимнастикой, чтобы ваша ViewModel была абсолютно чистой, но какой ценой?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...