将参数传递给ICommand

20

我有一个简单的按钮,在执行命令时使用,这一切都很正常,但是我想在单击按钮时传递文本参数。

我认为我的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();
    }
}
3个回答

13

Action更改为Action<T>,以便它带一个参数(可能只需使用Action<object>最容易)。

private readonly Action<object> _handler;

然后只需将参数传递给它:

public void Execute(object parameter)
{
    _handler(parameter);
}

谢谢,这很好用!我对WPF并不是很陌生,但是对MVVM还是新手,所以命令是一个新概念;但我已经能看到它们如何帮助单元测试了。因此,添加<object>并不是指类型为object的Action,而是这个委托需要一个对象参数? - Michael Harper
@MichaelHarper 是的,确切地说,一个带有一个对象参数的委托。你可以看到他们定义了多个类似这样的操作类型:http://msdn.microsoft.com/en-us/library/018hxwa8.aspx - McGarnagle
再次感谢,你的帮助非常棒 :D - Michael Harper

7

你可以这样做

public ICommand AddPhoneCommand
{
    get
    {
        return new Command<string>((x) =>
        {
            if(x != null) { AddPhone(x); }
        };
    }
}

然后,当然要有你的AddPhone
public void AddPhone(string x)
{
    //handle x
}

缺少一个闭合括号。return new Command<string>((x) => { if(x != null) { AddPhone(x); }}); - Vultuxe

3
你可以简单地这样做(不需要更改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;
    ...
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接