Подтвердить что ты не робот

Передача параметра в 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();
    }
}
4b9b3361

Ответ 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
}