Рассмотрим ссылку статьи 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; } }