Как предотвратить закрытие ViewModel (и отмену модели) в Catel

Мне нужно предотвратить закрытие ViewModel, а также предотвратить отмену редактирования модели. Я попытался переопределить OnClosing в ViewModel, но это событие произошло слишком поздно. Это произошло после того, как редактирование модели было отменено. (Мне кажется странным порядок событий.)

Я нашел старый вопрос и ответ, в котором говорилось об использовании OnViewModelCanceling, однако этот метод не существует как переопределяемый в текущей версии.

Я нашел OnViewModelEvent, но псевдоним не вызывается ни для какого события в моей ViewModel.

Итак, является ли правильным решением переопределить Cancel в ViewModel и вернуть false, или нужно зарегистрироваться для события Canceling в ViewModel?

Я попытался использовать переопределение Cancel, и это работает для простой ViewModel. Однако, если текущая ViewModel имеет вложенные элементы управления с ViewModels, и они тоже возвращают false из Cancel, внешняя ViewModel никогда даже не получит трещину при Cancel. (Что имеет смысл.) Моя проблема здесь в том, что иногда я ДЕЙСТВИТЕЛЬНО хочу соблюдать Cancel, и внешняя ViewModel знает об этом, но вложенные ViewModels не знают. Я знаю, что могу решить эту проблему разными способами, но я хотел бы знать, есть ли лучший способ предотвратить отмену редактирования модели, прежде чем я решу эту новую проблему.

Это может нарушать правило «один вопрос на вопрос», но это очень тесно связано. Мне также нужно знать, как разрешить закрытие ViewModel, но НЕ выполнять EndEdit (или CancelEdit) для его моделей.

Приложение WPF с использованием Catel 3.9


person SOHO Developer    schedule 22.04.2014    source источник


Ответы (1)


Вы можете переопределить Save() и вернуть false. Предотвратить закрытие пользовательского элемента управления будет трудно, потому что это будет очень трудно понять для конечного пользователя.

Убедитесь, что не вызываете базу перед возвратом false, потому что base.Save() и base.Cancel() активируют редактирование модели.

person Geert van Horrik    schedule 22.04.2014
comment
Меня смущает ваше заявление о том, что вызов base.Save() и base.Cancel приведет к редактированию модели. Код в 3.9 строках 1520 1nd 1528 ViewModelBase просто возвращает True. Я согласен с тем, что возврат false останавливает редактирование, но он также (по крайней мере, так, как я закодировал) предотвращает закрытие представления, и окно продолжает отображаться. - person SOHO Developer; 23.04.2014
comment
Извините, вам не нужно ничего делать с базой. Давно это было, не помнил, что уже менял :-). Как видно из исходного кода, возврат false как для отмены, так и для сохранения должен препятствовать обработке моделей. См. github.com/Catel/Catel/blob/develop/src/Catel.MVVM/ - person Geert van Horrik; 23.04.2014
comment
Да, но, как я уже сказал, то, как я закодировал вещи, возвращает false из Сохранить или Отменить, предотвращает закрытие представления. Это ожидаемое поведение или у меня что-то не так? - person SOHO Developer; 23.04.2014
comment
Да, это ожидаемое поведение. Если вы не хотите, чтобы Catel управлял моделями, вы можете сделать это самостоятельно двумя способами: 1) Удалить атрибут Model 2) Использовать атрибут Model с SupportIEditableObject = false - person Geert van Horrik; 23.04.2014