Рассмотрим ссылку статьи WPF Джоша Смита с шаблоном проектирования Model-View-ViewModel, в частности пример реализации RelayCommand
(На рисунке 3). (Нет необходимости читать всю статью по этому вопросу.)
В целом, я считаю, что реализация отличная, но у меня есть вопрос о делеции CanExecuteChanged
подписки на событие CommandManager
RequerySuggested
. Документация для RequerySuggested
гласит:
Поскольку это событие статично, оно будет удерживать только обработчик как слабый Справка. Объекты, которые слушают это событие должно ссылки на их обработчик событий на избегайте его сбора мусора. Эта может быть достигнуто путем частного поля и присвоения обработчик как значение до или после присоединение к этому событию.
Однако примерная реализация RelayCommand
не поддерживает такой подписанный обработчик:
public event EventHandler CanExecuteChanged
{
add { CommandManager.RequerySuggested += value; }
remove { CommandManager.RequerySuggested -= value; }
}
- Происходит ли эта утечка слабая ссылка с клиентом
RelayCommand
, требуя, чтобы пользовательRelayCommand
понимал реализациюCanExecuteChanged
и поддерживал собственную ссылку? -
Если это так, имеет смысл, например, изменить реализацию
RelayCommand
, чтобы быть чем-то вроде следующего, чтобы смягчить потенциальную преждевременную GC подписчикаCanExecuteChanged
:// This event never actually fires. It purely lifetime mgm't. private event EventHandler canExecChangedRef; public event EventHandler CanExecuteChanged { add { CommandManager.RequerySuggested += value; this.canExecChangedRef += value; } remove { this.canExecChangedRef -= value; CommandManager.RequerySuggested -= value; } }