Передача параметра типа объекта в функцию, вызываемую из команды Deleagte в WPF MVVM
Почему следующая функция принимает объектный тип параметров в WPF MVVM?
public ViewModel()
{
SaveCommand2 = new DelegateCommand(SaveCommand_Execute);
}
bool SaveCommand_CanExecute(object arg)
{
return Model.Name != string.Empty;
}
по умолчанию мы не передаем ничего в качестве параметра в функцию, так как в него передается NULL.
Если мы не хотим ничего передавать, лучше удалите параметр из функции. Но это не позволяет. Зачем?
4 ответа
DelegateCommand
является "общей" реализацией для создания команд. Команды WPF имеют дополнительный CommandParameter, который используется для предоставления данных команде при выполнении. Вот почему DelegateCommand
имеет аргумент типа object
Если используется привязка параметра команды, параметр передается через этот аргумент.
Я думаю, что вы можете создать собственную реализацию delegate
Команда преодолеть эту проблему. Вы можете взглянуть на Simplify DelegateCommand для наиболее распространенного сценария, чтобы получить больше информации.
Если вы реализуете свой собственный DelegateCommand, у вас могут быть конструкторы, которые получают действия без параметров, как показано в следующем коде:
public DelegateCommand(Action<object> execute, Func<object, bool> canExecute)
{
if (execute == null)
throw new ArgumentNullException("execute", "execute cannot be null");
if (canExecute == null)
throw new ArgumentNullException("canExecute", "canExecute cannot be null");
_execute = execute;
_canExecute = canExecute;
}
public DelegateCommand(Action<object> execute)
: this(execute, (o) => true)
{
}
public DelegateCommand(Action execute)
: this((o) => execute())
{
}
С этой последней перегрузкой конструктора вы могли бы сделать
var someCommand = new DelegateCommand(SomeMethod);
где метод без параметров
Попробуй это,
public ViewModel()
{
SaveCommand2 = new DelegateCommand(new Action(() =>
{
//Your action stuff.
}), SaveCommand_CanExecute);
}
bool SaveCommand_CanExecute()
{
return Model.Name != string.Empty;
}