Я борюсь с проблемой, связанной с классом RelayCommand. Я пытаюсь передать параметр методу для выполнения через RelayCommand, но не могу заставить его работать. Метод вызывается правильно, но переданный параметр всегда равен нулю.
Мой класс RelayCommand:
public class RelayCommand : ICommand
{
#region Fields
private readonly Action<object> _execute;
private readonly Predicate<object> _canExecute;
#endregion // Fields
#region Constructors
public RelayCommand(Action<object> execute)
: this(execute, null)
{
//
}
public RelayCommand(Action<object> execute, Predicate<object> canExecute)
{
if (execute == null)
throw new ArgumentNullException("execute");
_execute = execute;
_canExecute = canExecute;
}
#endregion // Constructors
#region ICommand Members
[DebuggerStepThrough]
public bool CanExecute(object parameter)
{
return _canExecute == null ? true : _canExecute(parameter);
}
public event EventHandler CanExecuteChanged
{
add { CommandManager.RequerySuggested += value; }
remove { CommandManager.RequerySuggested -= value; }
}
public void Execute(object parameter)
{
_execute(parameter);
}
#endregion // ICommand Members
}
Я пытаюсь передать простое текстовое значение
<Button
Margin = "0,8,8,0"
Content = "Ok"
IsDefault = "True"
CommandParameter = "Sample"
Style = "{StaticResource MaterialDesignFlatButton}">
<i:Interaction.Triggers>
<i:EventTrigger
EventName = "Click">
<i:InvokeCommandAction
Command = "{Binding CreateNewCommand}" />
</i:EventTrigger>
</i:Interaction.Triggers>
</Button>
Моя команда:
public ICommand CreateNewCommand
{
get
{
return new RelayCommand(param => CreateNew(param));
}
}
Независимо от того, какой объект всегда равен нулю.
private void CreateNew(object obj)
{
// obj is null
}
Что я делаю не так? Большое спасибо!
Я предлагаю вам взглянуть на набор инструментов сообщества mvvm nuget.
Кроме того, абсолютно допустимо обрабатывать события в коде программной части. Триггеры взаимодействия обычно бесполезны и имеют тенденцию создавать запахи кода, поскольку события пользовательского интерфейса не предназначены для обработки в какой-либо модели (поэтому они обычно являются маршрутизируемыми событиями). Для «событий», которые должны обрабатываться моделями, WPF представила интерфейс ICommandSource, чтобы включить инфраструктуру управления. Это проектное решение, согласно которому элементы управления WPF не реализуют ICommandSource. Фреймворки обычно обеспечивают чистый стиль кодирования.
Только те, которые запускают бизнес-операции, реализуют этот интерфейс (только несколько элементов управления реализуют этот интерфейс, например Button и MenuItem). И вам не нужны никакие сторонние библиотеки, такие как xzy toolkit и им подобные, для решения вашей проблемы. Игнорируйте такие рекомендации. Просто установите свойство Button.Command...





CommandParamter должен быть передан на InvokeCommandAction, а не на Button:
<Button
Margin = "0,8,8,0"
Content = "Ok"
IsDefault = "True"
Style = "{StaticResource MaterialDesignFlatButton}">
<i:Interaction.Triggers>
<i:EventTrigger
EventName = "Click">
<i:InvokeCommandAction
Command = "{Binding CreateNewCommand}"
CommandParameter = "Sample" />
</i:EventTrigger>
</i:Interaction.Triggers>
</Button>
отлично работает
Вы должны просто привязать свойство Command кнопки:
<Button ...
Command = "{Binding CreateNewCommand}"
CommandParameter = "Sample" />
Не используйте Interaction.Trigger. Это абсолютно избыточно и только загромождает ваш исходный код. Просто назначьте/привяжите экземпляр команды к свойству Button.Command (вы уже используете свойство Button.CommandParameter).