Pregunta

Me gustaría pasar un parámetro definido en el XAML (Ver) de mi aplicación a la clase ViewModel utilizando RelayCommand. Seguí el el excelente artículo de Josh Smith sobre MVVM y he implementado lo siguiente .

Código XAML

        <Button 
        Command="{Binding Path=ACommandWithAParameter}"
        CommandParameter="Orange"
        HorizontalAlignment="Left" 
        Style="{DynamicResource SimpleButton}" 
        VerticalAlignment="Top" 
        Content="Button"/>

Código de modelo de vista

  public RelayCommand _aCommandWithAParameter;
  /// <summary>
  /// Returns a command with a parameter
  /// </summary>
  public RelayCommand ACommandWithAParameter
  {
     get
     {
        if (_aCommandWithAParameter == null)
        {
           _aCommandWithAParameter = new RelayCommand(
               param => this.CommandWithAParameter("Apple")
               );
        }

        return _aCommandWithAParameter;
     }
  }

  public void CommandWithAParameter(String aParameter)
  {
     String theParameter = aParameter;
  }
  #endregion

Establecí un punto de interrupción en el método CommandWithAParameter y observé que un parámetro se estableció en " Apple " ;, y no " Orange " ;. Esto parece obvio ya que el método CommandWithAParameter se llama con la cadena literal & Quot; Apple & Quot ;.

Sin embargo, al buscar la pila de ejecución, puedo ver que " Orange " ;, el CommandParameter que configuré en XAML es el valor del parámetro para la implementación de RelayCommand del método de interfaz ICommand Execute.

Ese es el valor del parámetro en el método siguiente de la pila de ejecución es " Orange " ;,

  public void Execute(object parameter)
  {
     _execute(parameter);
  }

Lo que estoy tratando de averiguar es cómo crear la propiedad RelayCommand ACommandWithAParameter de modo que pueda llamar al método CommandWithAParameter con CommandParameter " Orange " definido en el XAML.

¿Hay alguna manera de hacer esto?

¿Por qué quiero hacer esto? Parte de & Quot; Localización sobre la marcha & Quot; En mi implementación particular, quiero crear un SetLanguage RelayCommand que se puede vincular a varios botones. Me gustaría pasar el identificador de lenguaje de dos caracteres (& Quot; en & Quot ;, & Quot; es & Quot ;, & Quot; ja & Quot ;, etc) como CommandParameter y que se defina para cada " set language " botón definido en el XAML. Quiero evitar tener que crear un comando SetLanguageToXXX para cada idioma que admite y codifica el identificador de idioma de dos caracteres en cada RelayCommand en ViewModel.

¿Fue útil?

Solución

No entiendo por qué tienes la complejidad adicional de especificar la lambda en primer lugar. ¿Por qué no hacer esto?

if (_aCommandWithAParameter == null)
{           
    _aCommandWithAParameter = new RelayCommand<object>(CommandWithAParameter);
}

private void CommandWithAParameter(object state)
{
    var str = state as string;
}

Otros consejos

Pasará el parámetro en la lambda al comando de la siguiente manera:

if (_aCommandWithAParameter == null)
{           
    _aCommandWithAParameter = new RelayCommand(               
        param => this.CommandWithAParameter(param)
        );        
}

Nada publicado aquí antes funcionó para mí.

Resulta que a todas las respuestas les falta <object> después de RelayCommand!

Esto funciona para mí:

public RelayCommand<object> OKCommand
{
    get
    {
        if (_okCommand == null)
            _okCommand = new RelayCommand<object>(OkCommand_Execute);
        return _okCommand;
    }
}
private RelayCommand<object> _okCommand = null;

private void OkCommand_Execute(object obj)
{
    Result = true;
}

Si desea usar un método CanExecute, use el siguiente código:

_okCommand = new RelayCommand<object>(OkCommand_Execute, OkCommand_CanExecute);

private bool OkCommand_CanExecute(object obj) { }

Solo estoy tratando de vender mi punto, mira esto si funciona ...

http: // mywpf- visu.blogspot.com/2009/12/relay-command-how-to-pass-parameter.html

Aquí hay una solución simple para el parámetro de comando, ya que estaba buscando ayuda sobre el tema. No pude encontrar nada en línea que fuera lo suficientemente simple. La siguiente solución funciona bien cuando está utilizando un comando de retransmisión. Tenía algunos hipervínculos para los que necesitaba obtener el valor de la URL que se hizo clic con el parámetro de comando.

Paso 1: en su comando de retransmisión, cree una propiedad simple que contendrá el valor del objeto de parámetro. Podría llamarlo valor de parámetro o cualquier nombre que prefiera.

public object ParameterValue
{
  get;
  set;
}

Paso 2: en el método Execute de la clase RelayCommand, establezca el valor o la propiedad creada anteriormente en el parámetro del método Execute.

readonly Action<object> m_execute;       // Action to execute

public void Execute(object parameter)
 {
   this.ParameterValue = parameter;
   m_execute(parameter);
 }

Paso 3: Ahora, cuando puede vincular el CommandParameter en xaml a cualquier valor que desee recuperar cuando se ejecuta el comando. ejemplo:

<TextBlock>
  <Hyperlink Command="{Binding Path=NavigateUrlCmd}"
             CommandParameter="{Binding ElementName=tbwebsite, Path=Text}">
    <TextBlock Name="tbwebsite" Text="{Binding Path=website}"/>
  </Hyperlink>
</TextBlock> 

Si tiene un comando llamado chickenCommand, cuando se ejecuta puede acceder al parámetro: chickenCommand.ParameterValue

Espero que esto ayude a alguien. Gracias por toda su ayuda anterior.

No puedo sustituir una referencia al nombre del método por la expresión lamda con un error de compilación. Aparentemente, y de ninguna manera sorprendente, una referencia de nombre de método no estático no puede usarse en lugar de una lambda. Apenas lo veo como & "; Complejidad añadida &"; Pasar constantemente lamdas tiene sentido para mí.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top