2011-06-21 12 views
17

Icommand contiene dos métodos y un evento.Evento CanExecuteChanged de ICommand

Lo que hacen los dos métodos es clara, pero No puedo entender lo que hace el evento que se proporciona en ICommand.

Cuando se provoca el evento CanExecuteChanged?

La explicación siguiente está en MSDN pero I no lo puedo entender.

CanExecuteChanged se eleva si el administrador comando que centraliza las operaciones de mando detecta un cambio en la fuente de comandos que podría invalidar un comando que se ha planteado, pero aún no ejecutado por el comando de unión .

¿Puede explicar esto en términos simples?

Gracias ......

Respuesta

7

CanExecuteChanged se eleva cuando el método de un ICommandCanExecute se cambia

En algunas bibliotecas 3 ª parte, el evento CanExecuteChanged También se planteó si los parámetros CanExecute plantean un evento PropertyChanged. Por ejemplo, MVVM Light Toolkit RelayCommand plantea el evento CanExecuteChanged si los parámetros CanExecute provocan un evento PropertyChanged, mientras que el DelegateCommand de Prism no lo hace.

+0

cómo lo hace posible cambiar el método 'CanExecute' en tiempo de ejecución? podrías por favor elaborar ... – Pritesh

+0

@Pritesh, use un predicado –

+0

@WingerSendon Veo que hay una firma alternativa que acepta un predicado de objeto, pero no entiendo lo que quiere decir. –

21

Este evento se genera por el comando para notificar a los consumidores que es (Button es decir, Menultem) que es propiedad CanExecute puede haber cambiado. Entonces, si el foco se mueve de un TextBox a otro, es posible que su comando deba habilitarse/deshabilitarse. Esta información también se debe pasar a cualquier control usando su comando.

En general, este evento simplemente reexposes caso CommandManager.RequerySuggested. De la clase RoutedCommand:

public event EventHandler CanExecuteChanged { 
    add { 
     CommandManager.RequerySuggested += value; 
    } 
    remove { 
     CommandManager.RequerySuggested -= value; 
    } 
} 

El evento se dispara RequerySuggested con bastante frecuencia, ya que el foco se mueve, se cambia la selección de texto. Esto también se puede levantar manualmente llamando InvalidateRequerySuggested.

+0

tengo un comando de eliminar que elimina la fila de la cuadrícula de datos, y cuando muevo el foco de la cuadrícula de datos a TEXTBOX no se dispara 'CanExecuteChanged' como dijiste ... he puesto dos marcadores en el lado ADD y QUITE el bloque pero puedo 't conseguir puntero en ese lugar ... – Pritesh

+0

@Pritesh - tendría que enviar el código que tiene. Si el elemento que usa su comando no está visible, entonces no necesitaría consultar su comando. En general, solo necesita activar ese evento cuando cambia su estado CanExecute. WPF generalizó para levantar simplemente el caso cuando piensan en la CanExecute podría haber cambiado (es decir, con los cambios de enfoque, los cambios de selección, etc.). – CodeNaked

Cuestiones relacionadas