Relaycommand и метод выполнения без параметров

В настоящее время я изучаю WPF и MVVM, думаю, я понял большинство из них и то, как они работают, но я столкнулся с кое-чем об использовании RelayCommand (или DelegateCommand), которое я не понимаю. Я думаю, что это связано с тем, как работают делегаты.

Обратите внимание, что код, приведенный ниже, в данный момент только в тестовых решениях, так что нет реального кода. Также я рассматриваю это для команд, которые не требуют такого параметра, как close, и чтобы понять, почему он работает.

Так что, если я возьму RelayCommand, который создал Джош Смит (http://msdn.microsoft.com/en-us/magazine/dd419663.aspx#id0090030) Я могу настроить команду следующим образом:

RelayCommand updateTextContentCommand;

public ICommand UpdateTextContentCommand
{
    get
    {
        if (updateTextContentCommand == null)
        {
            updateTextContentCommand = new RelayCommand(
                param => this.UpdateTextContentCommand_Execute());
        }
        return updateTextContentCommand;
    }
}

с этим методом execute:

public void UpdateTextContentCommand_Execute()
{
    this.TextContent = DateTime.Now.ToString();
}

Я использовал простую привязку к TextBlock, чтобы увидеть результат, а команда привязана к кнопке. Это отлично работает. Чего я не получаю, так это использования лямбда-выражения для создания команды.Action<object> ожидает, что параметр не так ли? так почему этот код работает?

Если я изменю код выше

if (updateTextContentCommand == null)
{
    updateTextContentCommand = new RelayCommand(
        this.UpdateTextContentCommand_Execute());
}

Я получаю эти ошибки:

* Наилучшее совпадение перегруженного метода для & quot; MVVM.RelayCommandTesting.Framework.RelayCommand.RelayCommand (System.Action) & apos; имеет несколько неверных аргументов

Аргумент 1: невозможно преобразовать из 'void' к "System.Action" *

и удаление() после выполнения выдает эту ошибку:

Argument 1: cannot convert from 'method group' to 'System.Action'

Но если я изменю код следующим образом:

if (updateTextContentCommand == null)
{
    updateTextContentCommand = new RelayCommand(
        this.UpdateTextContentCommand_Execute);
}

public void UpdateTextContentCommand_Execute(object param)
{
    this.TextContent = DateTime.Now.ToString();
}

это соответствует и работает нормально. Если я изменю представление для использования CommandParameter, я смогу затем использовать param для установки текстового содержимого с помощью этого метода, но если я использую стиль лямбда-выражения, мне нужно передать параметр в строку, чтобы он был таким, как этот param = & gt;this.UpdateTextContentCommand_Execute(param).

В моем тесте я жестко запрограммировал значение CommandParameter, но я думаю, что, скорее всего, это будут данные, связанные со свойством ViewModel в реальной системе, чтобы вы могли передавать параметр в стиле лямбда.

Кто-нибудь может объяснить, почему версия без параметров работает с лямбда-стилем, пожалуйста?

Спасибо, что нашли время, чтобы прочитать это.

Кажется, у вопроса ниже были некоторые вопросы и о лямбде, но я не вижу, что она отвечает на мой вопрос.

Передача параметра с использованием RelayCommand, определенного в ViewModel (из примера Джоша Смита)

Ответы на вопрос(1)

Ваш ответ на вопрос