MVVM Light RelayCommand Параметры - PullRequest
45 голосов
/ 14 марта 2011

У меня проблема с передачей параметра в команду relay с использованием инфраструктуры GalaSoft MVVM Light.Я знаю, что реализация relaycommand в mvvm light не использует лямбда-параметры, поэтому я провел некоторое исследование и нашел способ, как люди обходили его, делая что-то вроде этого:

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

Однако я продолжаю получатьошибка в строке _projmenuItem_Edit = new RelayCommand(ProjEditNode); с надписью Argument 1: cannot convert from 'method group' to 'System.Action'

Что мне не хватает?

Ответы [ 3 ]

81 голосов
/ 14 марта 2011

Я полагаю, что это будет работать:

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

- EDIT -

Вам также нужно определить свой RelayCommand с типом:

например

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

private void Test(string s)
{
    throw new NotImplementedException();
}
4 голосов
/ 14 марта 2011

Я не думаю, что RelayCommand() имеет конструктор, который не является пустым. вы пытаетесь передать ему неправильный метод.

Если вы хотите, чтобы RelayCommand поддерживал параметры команды, вы должны использовать RelayCommand<T>, где T может быть параметром любого типа. В вашей ситуации это будет RelayCommand<String>, который будет принимать метод с подписью void (string). (и поэтому также будет строго напечатан и не будет использовать уродливый объект)

2 голосов
/ 12 ноября 2012

Еще один способ объявления команд реле, поможет уменьшить ваш код

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

public void ExecuteChartCommand(string vendor)
{

}
...