Я знаю, что этот вопрос задан много раз, но я постараюсь быть конкретным, насколько это возможно.Как правильно обрабатывать событие закрытия окна в wpf MVVM
Я новичок в WPF/MVVM и используя MVVM Light Toolkit от Galasoft в своем проекте.
У меня есть вид, содержащий форму, в которой пользователь вводит некоторые данные о пациенте. Когда они нажимают кнопку закрытия (X), я хочу проверить, что они что-то ввели, и если да, спросите их, хотят ли они сохранить до закрытия с помощью (Да, Нет и Отменить). Я сделал некоторые исследования и обнаружили, что многие предполагают функцию EventToCommand как так,
XAML
<Window
xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"
xmlns:cmd="clr-namespace:GalaSoft.MvvmLight.Command;assembly=GalaSoft.MvvmLight.Extras.WPF45"
DataContext="{Binding Main, Source={StaticResource Locator}}">
<i:Interaction.Triggers>
<i:EventTrigger EventName="Closing">
<cmd:EventToCommand Command="{Binding OnClosingCommand}"
PassEventArgsToCommand="True"/>
</i:EventTrigger>
</i:Interaction.Triggers>
...
</Window>
View Model
public class MainViewModel : ViewModelBase
{
public RelayCommand<CancelEventArgs> OnClosingCommand { get; set; }
public MainViewModel()
{
this.OnClosingCommand =
new RelayCommand<CancelEventArgs>(this.OnClosingCommandExecuted);
}
private void OnClosingCommandExecuted(CancelEventArgs cancelEventArgs)
{
// logic to check if view model has updated since it is loaded
if (mustCancelClosing)
{
cancelEventArgs.Cancel = true;
}
}
}
Приведенный выше пример взят из Confirmation when closing window with 'X' button with MVVM light
Однако создатель MVVM L Сам Инструментарий говорит, что это нарушает разделение беспокойства, которое пытается создать шаблон MVVM, поскольку он передает аргументы события, принадлежащие представлению (в данном случае CancelEventArgs
) модели представления. Он так сказал в этой статье http://blog.galasoft.ch/posts/2014/01/using-the-eventargsconverter-in-mvvm-light-and-why-is-there-no-eventtocommand-in-the-windows-8-1-version/
Итак, мой вопрос: как правильно обращаться с такой проблемой, которая не нарушает шаблон MVVM. Любая точка в правильном направлении была бы очень признательна!