2012-10-28 32 views
14

我有一個簡單的按鈕,當執行時使用一個命令,這是所有工作正常,但我想單擊按鈕時傳遞一個文本參數。傳遞一個參數到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(); 
    } 
} 

回答

8

變化ActionAction<T>因此,它需要一個參數(可能只是Action<object>是最簡單的)。

private readonly Action<object> _handler; 

,然後只需將它傳遞的參數:

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

非常感謝!我對WPF並不陌生,但我是MVVM的新手,所以命令是一個新概念;但我已經可以看到他們將如何幫助單元測試。因此,添加並不是說類型對象的Action,而是這個委託需要一個對象參數? –

+0

@MichaelHarper是的,確切地說,一個代表一個對象參數。您可以看到他們已經沿着這些行定義了多種操作類型:http://msdn.microsoft.com/en-us/library/018hxwa8.aspx – McGarnagle

+0

再次感謝,得到了很大的幫助:D –

1

你可以簡單地做到這一點(不改變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; 
    ... 
} 
0

你可以只是做

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

然後,提示你有你的AddPhone

public void AddPhone(string x) 
{ 
    //handle x 
}