45 votes

MVVM Light RelayCommand Paramètres

Je rencontre un problème pour passer un paramètre à un RelayCommand en utilisant le framework GalaSoft MVVM Light. Je sais que l'implémentation de RelayCommand de mvvm light n'utilise pas de paramètres lambda, donc j'ai fait des recherches et j'ai trouvé une méthode utilisée par les gens pour contourner cela en faisant quelque chose comme ceci :

public RelayCommand ProjMenuItem_Edit
{
    get
    {
        if (_projmenuItem_Edit == null)
        {
            //Cela devrait fonctionner....
            _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;
}

Cependant, je reçois une erreur à la ligne _projmenuItem_Edit = new RelayCommand(ProjEditNode); qui dit Argument 1: cannot convert from 'method group' to 'System.Action'

Qu'est-ce que j'ai raté ?

84voto

Robaticus Points 14665

Je crois que cela fonctionnera :

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

-- EDIT --

Vous devrez également définir votre RelayCommand avec le type :

par exemple

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

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

4voto

Elad Katz Points 4105

Je ne pense pas que RelayCommand() ait un constructeur qui n'est pas vide. vous essayez de lui passer le mauvais type de méthode.

Si vous voulez que RelayCommand prenne en charge les paramètres de commande, vous devriez utiliser RelayCommand où T peut être n'importe quel type de paramètre. Dans votre situation, ce serait RelayCommand qui accepterait une méthode avec une signature void(string). (et serait donc également fortement typé et n'utiliserait pas le moche objet)

2voto

Un autre moyen de déclarer des commandes de relais, va aider à réduire votre code

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

public void ExecuteChartCommand(string vendor)
{

}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X