Передача параметра в ICommand
У меня есть простая кнопка, которая использует команду при выполнении, все это работает нормально, но я хочу передать текстовый параметр при нажатии кнопки.
Я думаю, что мой XAML в порядке, но я не уверен, как изменить класс RelayCommand
для получения параметра:
<Button x:Name="AddCommand" Content="Add"
Command="{Binding AddPhoneCommand}"
CommandParameter="{Binding Text, ElementName=txtAddPhone}" />
public class RelayCommand : ICommand
{
private readonly Action _handler;
private bool _isEnabled;
public RelayCommand(Action handler)
{
_handler = handler;
}
public bool IsEnabled
{
get { return _isEnabled; }
set
{
if (value != _isEnabled)
{
_isEnabled = value;
if (CanExecuteChanged != null)
{
CanExecuteChanged(this, EventArgs.Empty);
}
}
}
}
public bool CanExecute(object parameter)
{
return IsEnabled;
}
public event EventHandler CanExecuteChanged;
public void Execute(object parameter)
{
_handler();
}
}
Ответы
Ответ 1
Измените Action
на Action<T>
так, чтобы он принял параметр (возможно, просто Action<object>
проще).
private readonly Action<object> _handler;
И затем просто передайте ему параметр:
public void Execute(object parameter)
{
_handler(parameter);
}
Ответ 2
Вы можете просто сделать это (никаких изменений в RelayCommand или ICommand не требуется):
private RelayCommand _addPhoneCommand;
public RelayCommand AddPhoneCommand
{
get
{
if (_addPhoneCommand == null)
{
_addPhoneCommand = new RelayCommand(
(parameter) => AddPhone(parameter),
(parameter) => IsValidPhone(parameter)
);
}
return _addPhoneCommand;
}
}
public void AddPhone(object parameter)
{
var text = (string)parameter;
...
}
public void IsValidPhone(object parameter)
var text = (string)parameter;
...
}
Ответ 3
Вы могли бы просто сделать
public ICommand AddPhoneCommand
{
get
{
return new Command<string>((x) =>
{
if(x != null) { AddPhone(x); }
};
}
}
Тогда, конечно, у вас есть AddPhone
:
public void AddPhone(string x)
{
//handle x
}