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 (из примера Джоша Смита)