2011-03-14 11 views
39

Tengo un problema al pasar un parámetro a un comando de retransmisión usando el marco GalaSoft MVVM Light. Yo sé que la aplicación de la luz MVVM de RelayCommand no utiliza parámetros lambda, así que hice algunas investigaciones y encontró una manera de que las personas trabajaron alrededor de ella haciendo algo como esto:MVVM Light Relay Parámetros de comando

public RelayCommand ProjMenuItem_Edit 
{ 
    get 
    { 
     if (_projmenuItem_Edit == null) 
     { 
      //This should work.... 
      _projmenuItem_Edit = new RelayCommand(ProjEditNode); 
     } 
     return _projmenuItem_Edit; 
    } 
} 

private void ProjEditNode(object newText) 
{ 
    var str = newText as string; 
    OrganLocationViewModel sel = 
     ProjectOrganLocationView.GetExtendedTreeView().GetTopNode(); 

    //Console.WriteLine(sel.OrganDisplayName); 
    sel.OrganDisplayName = str; 
} 

Sin embargo, Me aparece un error en la línea _projmenuItem_Edit = new RelayCommand(ProjEditNode); que dice Argument 1: cannot convert from 'method group' to 'System.Action'

¿Qué me falta?

Respuesta

76

creo que esto va a funcionar:

_projmenuItem_Edit = new RelayCommand<object>((txt)=>ProjEditNode(txt)); 

- EDITAR -

Tendrá que definir su RelayCommand con el tipo así:

por ejemplo,

public RelayCommand<string> myCommand { get; private set; } 
myCommand = new RelayCommand<string>((s) => Test(s)); 

private void Test(string s) 
{ 
    throw new NotImplementedException(); 
} 
+0

que he visto esto antes y lo han intentado , pero parece que RelayCommand de GalaSoft no incluye una implementación de RelayCommand ? Recibo este error cuando intento RelayCommand : No puedo convertir implícitamente el tipo 'GalaSoft.MvvmLight.Command.RelayCommand ' en 'GalaSoft.MvvmLight.Command.RelayCommand' – Saggio

+0

Gah, intenté editar pero era demasiado tarde ... Ignore el comentario anterior, me olvidé de cambiar _projmenuItem_Edit para escribir RelayCommand también: p – Saggio

+2

Actualicé la respuesta también, para cualquier otra persona que se esté metiendo en esto. :) – Robaticus

4

no creo que RelayCommand() tiene un constructor que no está vacío. estás tratando de pasarle el tipo de método equivocado.

Si desea que el RelayCommand admita los parámetros de comando, debe usar RelayCommand<T> donde T puede ser cualquier tipo de parámetro. En su situación sería RelayCommand<String> que aceptaría un método con firma vacía (cadena). (Y por lo tanto también sería de tipo firme y no utilizar el objeto feo)

1

Otra manera de declarar comandos de relé, ayudará a reducir su código

public RelayCommand ChartCommand 
{ 
    set 
    { 
     RelayCommand<string> chartCommand = 
      new RelayCommand<string>(e => ExecuteChartCommand(e));    
    } 
} 

public void ExecuteChartCommand(string vendor) 
{ 

} 
Cuestiones relacionadas