2012-02-02 6 views
2

MVVMツールキットversion1を使用しています。私は2つのテキストボックスtextbox1とtextbox2を持っています。ボタンを押したときにこれらの2つの値をパラメータとして渡す必要があり、結果をtextbox3という名前の3番目のテキストボックスに表示する必要があります。このマルチバインディングを使用してコマンドにパラメータを渡すにはどうすればよいですか?

public ICommand AddCommand 
    { 
     get 
     { 
      if (addCommand == null) 
      { 
       addCommand = new DelegateCommand<object>(CommandExecute,CanCommandExecute); 
      } 
      return addCommand; 
     } 
    } 

    private void CommandExecute(object parameter) 
    { 
     var values = (object[])parameter; 
     var a= (int)values[0]; 
     var b= (int)values[1]; 
     Calculater calcu = new Calcu(); 
     int c = calcu.sum(a, b);  
    } 

    private bool CanCommandExecute(object parameter) 
    { 
     return true; 
    } 

のような類似した

私のVMコードcommandExecute方法は、ユーザーがボタンをクリックしたときに呼び出されますが、私のパラメータ引数には、任意の値を持っていません。どのように私はパラメータとしてユーザーの値を渡すことができますか?結果をtexbox3に返しますか?

答えて

10

マルチバインディングとコンバータを使用できます

<Button Content="Add" Command="{Binding AddCommand}" 
<Button.CommandParameter> 
    <MultiBinding Converter="{StaticResource YourConverter}"> 
     <Binding Path="Text" ElementName="txt1"/> 
     <Binding Path="Text" ElementName="txt2"/> 
    </MultiBinding> 
</Button.CommandParameter> 
</Button> 

コンバータ

public class YourConverter : IMultiValueConverter 
{ 
public object Convert(object[] values, ...) 
{ 
    //.Net4.0 
    return new Tuple<int, int>((int)values[0], (int)values[1]); 

    //.Net < 4.0 
    //return values.ToArray(); 
} 

... 
} 

コマンド

private void CommandExecute(object parameter) 
{ 
    var o= (Tuple<int, int>)parameter; 
    var a= o.Item1; 
    var b= o.Item2; 
    Calculater calcu = new Calcu(); 
    int c = calcu.sum(a, b);  
} 

PS:plsは私の構文をチェック - それは私の心から書かれた...

+0

私は同じように従っています。 Tupleをサポートしていない.net framework 3.5を使用しています。だから私はObjectそれ自身としてそれを返しました。コードがCommandExecuteメソッドに達すると、パラメーター値はnullになります。パラメータがテキストボックスに割り当てられた値を取得する方法あなたのコンバータの – niknowj

+0

は次のものを使用します:return values.ToArray();これは役に立ちます。あなたは "新しい"配列を作成しなければなりません。新しいオブジェクト{values [0]、values [1]}を返します。うまくいくはずです。 – blindmeis

1

あなたは

<TextBox Text={Binding Path=String1}></TextBox> 
<TextBoxText={Binding Path=String2}></TextBox> 
<Button Command={Binding Path=AddCommand}>Add</Button> 
<TextBoxText={Binding Path=String3></TextBox> 
public MyViewModel:INotifyPropertyChanged 
{ 
private string1; 
private string2; 
private string3; 

//Make a similar propety for string2 and string3 
public string String1 
{   
    get   
    {    
     return string1;   
    } 
    set 
    { 
     string1=value; 
     //Implementation of Propertychanged is left upon you 
     InvokePropertyChanged("String1"); 
    }  
}  


public ICommand AddCommand  
{   
    get   
    {    
     if (addCommand == null)    
     {     
      addCommand = new DelegateCommand<object>(CommandExecute,CanCommandExecute);    
     }    
     return addCommand;   
    }  
}  
private void CommandExecute(object parameter)  
{   
    var a= String1;   
    var b= String2;   
    Calculater calcu = new Calcu();   
    String3 = (calcu.sum(a, b)).ToString();   
}  
private bool CanCommandExecute(object parameter)  
{   
    return true;  
} 
} 

XAMLをあなたのViewModelにプロパティを作成し、あなたの変更を通知するためにINotifyPropertyChangedのを使用する必要がTextBox ....

ビューモデルにバインドすることができます

+0

お返事ありがとうございました。私のシナリオでは、プロパティでテキストボックスをバインドしたくありません。私は、ボタンコントロールで付けられたコマンドにパラメータとして値を渡したいと思います。 – niknowj

関連する問題