web-dev-qa-db-de.com

MVVM Light RelayCommand-Parameter

Ich habe ein Problem mit der Übergabe eines Parameters an einen Relaiskommando mit dem GalaSoft MVVM Light Framework. Ich weiß, dass bei der Implementierung des Relaiskommandos von mvvm light keine Lambda-Parameter verwendet werden. Daher habe ich einige Nachforschungen angestellt und einen Weg gefunden, wie die Leute damit umgehen:

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

In der Zeile _projmenuItem_Edit = new RelayCommand(ProjEditNode); mit der Aufschrift Argument 1: cannot convert from 'method group' to 'System.Action' Wird jedoch immer wieder ein Fehler angezeigt.

Was vermisse ich?

45
Saggio

Ich glaube das wird funktionieren:

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

- BEARBEITEN -

Sie müssen Ihren RelayCommand auch mit dem Typ definieren:

z.B.

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

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

Ich glaube nicht, dass RelayCommand() einen Konstruktor hat, der nicht leer ist. Sie versuchen, die falsche Methode zu übergeben.

Wenn der RelayCommand Befehlsparameter unterstützen soll, sollten Sie RelayCommand<T> wobei T ein beliebiger Parametertyp sein kann. In Ihrer Situation wäre es RelayCommand<String>, das eine Methode mit ungültiger (String-) Signatur akzeptieren würde. (und dafür wäre auch stark getippt und würde das hässliche Objekt nicht benutzen)

4
Elad Katz

Eine andere Möglichkeit, Relay-Befehle zu deklarieren, trägt dazu bei, den Code zu reduzieren

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

public void ExecuteChartCommand(string vendor)
{

}