2012-10-28 2 views
14

私は実行時にコマンドを使用する単純なボタンを持っていますが、これはうまくいきますが、ボタンをクリックするとテキストパラメータを渡したいと思います。パラメータをICommandに渡す

私は私のXAMLはOKだと思いますが、私は、パラメータを受け取るために私の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はい、正確には、1つのオブジェクトパラメータを受け取るデリゲートです。これらの行に沿って複数のアクションタイプを定義していることがわかります。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 
} 
関連する問題