Considere la referencia Josh Smith' article WPF Apps With The Model-View-ViewModel Design Pattern, específicamente la implementación de ejemplo de RelayCommand
(en la figura 3). (No es necesario leer todo el artículo para esta pregunta.)¿La implementación de Josh Smith del RelayCommand está defectuosa?
En general, creo que la aplicación es excelente, pero tengo una pregunta sobre la delegación de CanExecuteChanged
suscripciones a RequerySuggested
caso de que el CommandManager
's. Los documentation for RequerySuggested
estados:
Ya que este evento es estático, que se sólo se sostienen sobre el manejador como una débil referencia . Los objetos que escuchan este evento deben mantener una fuerte referencia a su controlador de eventos al para evitar que sea basura. Este se puede lograr teniendo un campo privado y asignando el controlador como el valor anterior o posterior al asociado a este evento.
Sin embargo, la implementación de ejemplo de RelayCommand
no mantiene dicha al controlador suscrito:
public event EventHandler CanExecuteChanged
{
add { CommandManager.RequerySuggested += value; }
remove { CommandManager.RequerySuggested -= value; }
}
- ¿Este fugas de la referencia débil hasta el cliente del
RelayCommand
's, lo que requiere que el usuario de elRelayCommand
entiende la implementación deCanExecuteChanged
y mantiene una referencia en vivo por sí mismos? Si es así, ¿tiene sentido que, por ejemplo, modificar la ejecución de
RelayCommand
a ser algo así como lo siguiente para mitigar el potencial GC prematuro de laCanExecuteChanged
suscriptor:// This event never actually fires. It's 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; } }
Gran pregunta ... También me pregunto si htf es RequerySuggested saber cuándo es necesaria una nueva consulta. –
RequerySuggested se activa cuando es posible que se deba actualizar el estado CanExecute. Creo que los clientes también pueden despedirlo manualmente si el cliente sabe algo que WPF no sabe. –
@Greg - ¿Y con qué parámetros sabe RequerySuggested si puede ser necesario actualizar el estado de CanExecute? :) – VitalyB