Considerare il riferimento Josh Smith' article WPF Apps With The Model-View-ViewModel Design Pattern, in particolare l'implementazione di esempio di RelayCommand
(nella figura 3). (Non c'è bisogno di leggere l'intero articolo per questa domanda.)L'implementazione di RelayCommand di Josh Smith è difettosa?
In generale, penso che l'implementazione è eccellente, ma ho una domanda circa la delegazione di CanExecuteChanged
abbonamenti a RequerySuggested
evento s' il CommandManager
. I documentation for RequerySuggested
afferma:
Poiché questo evento è statico, sarà contenere solo sul gestore come un debole riferimento. Gli oggetti che ascoltano questo evento dovrebbero mantenere un forte riferimento al loro gestore di eventi su , evitando che venga sottoposto a garbage collection. Questo può essere eseguito con un campo privato e assegnando il gestore come valore precedente o successivo a associato a questo evento.
Eppure l'attuazione campione di RelayCommand
non mantiene tale al gestore sottoscritto:
public event EventHandler CanExecuteChanged
{
add { CommandManager.RequerySuggested += value; }
remove { CommandManager.RequerySuggested -= value; }
}
- Questo fuoriuscire il riferimento debole fino al cliente 's il
RelayCommand
, richiedendo che l'utente di ilRelayCommand
comprende l'implementazione diCanExecuteChanged
e mantiene un riferimento dal vivo? Se è così, ha senso per, ad esempio, modificare l'implementazione di
RelayCommand
essere qualcosa di simile al seguente per mitigare il potenziale GC prematura delCanExecuteChanged
abbonato:// 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; } }
Ottima domanda ... Mi chiedo anche che htf sia RequerySuggested sapendo quando è necessaria una richiesta .. –
RequerySuggested è documentato per attivare quando è necessario aggiornare lo stato CanExecute. Credo che possa anche essere attivato manualmente dai client se il client sa qualcosa che WPF stesso non conosce. –
@Greg - E in base a quali parametri RequerySuggested sa se lo stato CanExecute potrebbe dover essere aggiornato? :) – VitalyB