web-dev-qa-db-fra.com

Paramètres de commande de relais de lumière MVVM

J'ai un problème avec le passage d'un paramètre à une commande relay à l'aide du framework GalaSoft MVVM Light. Je sais que l'implémentation de relaycommand par mvvm light n'utilise pas de paramètres lambda, j'ai donc fait des recherches et trouvé un moyen de contourner ce problème en faisant quelque chose comme ceci:

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;
}

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

Qu'est-ce que je rate?

45
Saggio

Je crois que cela fonctionnera:

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

-- MODIFIER --

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();
}
84
Robaticus

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 souhaitez que RelayCommand prenne en charge les paramètres de commande, vous devez utiliser RelayCommand<T> où T peut être n'importe quel type de paramètre. Dans votre situation, ce serait RelayCommand<String> qui accepterait une méthode avec une signature vide (chaîne). (et à cet effet serait également fortement typé et n'utilisera pas l'objet laid)

4
Elad Katz

Une autre façon de déclarer les commandes de relais vous aidera à réduire votre code

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

public void ExecuteChartCommand(string vendor)
{

}