Я хотел бы обработать Closing
событие (когда пользователь нажимает верхнюю правую кнопку «X») моего окна, чтобы в конечном итоге отобразить подтверждающее сообщение или / и отменить закрытие.
Я знаю, как сделать это в коде позади: подпишитесь на Closing
событие окна, затем используйте CancelEventArgs.Cancel
свойство.
Но я использую MVVM, поэтому я не уверен, что это хороший подход.
Я думаю, что хорошим подходом было бы связать Closing
событие с a Command
в моей ViewModel.
Я попробовал это:
<i:Interaction.Triggers>
<i:EventTrigger EventName="Closing">
<cmd:EventToCommand Command="{Binding CloseCommand}" />
</i:EventTrigger>
</i:Interaction.Triggers>
Со связанным RelayCommand
в моем ViewModel, но он не работает (код команды не выполняется).
Ответы:
Я бы просто связал обработчик в конструкторе View:
Затем добавьте обработчик в
ViewModel
:В этом случае вы ничего не получите, кроме сложности, используя более сложный шаблон с большей косвенностью (5 дополнительных строк
Command
шаблона XAML плюс ).Мантра «с нулевым выделением кода» сама по себе не является целью, цель состоит в том, чтобы отделить ViewModel от View . Даже когда событие связано с выделенным кодом в представлении,
ViewModel
оно не зависит от представления, и логика закрытия может быть проверена модулем .источник
Этот код работает просто отлично:
ViewModel.cs:
и в XAML:
при условии, что:
DataContext
основного контейнера.xmlns:command="clr-namespace:GalaSoft.MvvmLight.Command;assembly=GalaSoft.MvvmLight.Extras.SL5"
xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"
источник
i
в<i:Interaction.Triggers>
и как его получить.xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"
Этот вариант еще проще, и, возможно, подходит для вас. В своем конструкторе View Model вы можете подписать событие закрытия главного окна следующим образом:
Всего наилучшего.
источник
Вот ответ в соответствии с MVVM-шаблоном, если вы не хотите знать о Window (или любом его событии) в ViewModel.
В ViewModel добавьте интерфейс и реализацию
В окне я добавляю событие закрытия. Этот код не нарушает шаблон MVVM. Представление может знать о модели представления!
источник
IClosing
интерфейс, а не просто реализовыватьOnClosing
метод. В противном случаеDataContext as IClosing
актерский состав провалится и вернетсяnull
Боже, похоже здесь много кода для этого. У Стаса выше был правильный подход при минимальных усилиях. Вот моя адаптация ( с использованием MVVMLight но должен быть узнаваем) ... О и PassEventArgsToCommand = «True» это , безусловно , необходимо , как указано выше.
(благодарность Лорану Буньону http://blog.galasoft.ch/archive/2009/10/18/clean-shutdown-in-silverlight-and-wpf-applications.aspx )
В представлении модель:
в службе выключения
RequestShutdown выглядит примерно так, но в основномRequestShutdown или как там его называют, решает, закрыть приложение или нет (что в любом случае будет радостно закрывать окно):
источник
Запрашивающий должен использовать ответ STAS, но для читателей, которые используют призму и не используют galasoft / mvvmlight, они могут попробовать то, что я использовал:
В определении вверху для окна или usercontrol и т. Д. Определите пространство имен:
И чуть ниже этого определения:
Недвижимость в вашей viewmodel:
Прикрепите делегатскую команду в свой конструктор viewmodel:
Наконец, ваш код вы хотите достичь при закрытии элемента управления / окна / что угодно:
источник
Я хотел бы использовать обработчик событий в вашем файле App.xaml.cs, который позволит вам решить, закрывать ли приложение или нет.
Например, в вашем файле App.xaml.cs может быть что-то вроде следующего кода:
Тогда в вашем коде MainWindowViewModel вы можете иметь следующее:
источник
По существу, оконное событие не может быть назначено MVVM. В общем случае кнопка «Закрыть» отображает диалоговое окно с запросом пользователя «сохранить: да / нет / отмена», а MVVM может этого не достичь.
Вы можете сохранить обработчик события OnClosing, где вы вызываете Model.Close.CanExecute () и устанавливаете логический результат в свойстве события. Поэтому после вызова CanExecute (), если true, ИЛИ в событии OnClosed, вызовите Model.Close.Execute ()
источник
Я не делал много испытаний с этим, но, похоже, работает. Вот что я придумал:
источник
Для этого мы используем AttachedCommandBehavior. Вы можете прикрепить любое событие к команде в вашей модели представления, избегая какого-либо кода позади.
Мы используем его в нашем решении и практически не имеем кода
http://marlongrech.wordpress.com/2008/12/13/attachedcommandbehavior-v2-aka-acb/
источник
Использование MVVM Light Toolkit:
Предполагая, что есть команда Exit в модели представления:
Это получено в виде:
С другой стороны, я обрабатываю
Closing
событие вMainWindow
, используя экземпляр ViewModel:CancelBeforeClose
проверяет текущее состояние модели представления и возвращает true, если закрытие должно быть остановлено.Надеюсь, это кому-нибудь поможет.
источник
источник