Как передать параметры в команду с помощью мультисвязывания? - PullRequest
3 голосов
/ 02 февраля 2012

Я использую набор инструментов MVVM version1. У меня есть два текстовых поля textbox1 и textbox2. Мне нужно передать эти два значения в качестве параметра при нажатии на кнопку и нужно показать результат в третьем текстовом поле с именем textbox3.

мой код VM похож на этот

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;  
    }

Метод commandExecute вызывается, когда пользователь нажимает кнопку, но мой аргумент параметра не имеет никакого значения. Как я могу передать значения пользователя в качестве параметра? и вернуть результат в texbox3?

Ответы [ 2 ]

12 голосов
/ 02 февраля 2012

вы можете использовать Multibinding и конвертер

<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: пожалуйста, проверьте мой синтаксис - это написано из моей головы ...

1 голос
/ 02 февраля 2012

Вы можете сделать Свойства в вашей ViewModel и привязать его к вашим TextBox s, которые вам нужно использовать INotifyPropertyChanged, чтобы уведомить об изменении ....

Просмотр модели

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

<TextBox Text={Binding Path=String1}></TextBox>
<TextBoxText={Binding Path=String2}></TextBox>
<Button Command={Binding Path=AddCommand}>Add</Button>
<TextBoxText={Binding Path=String3></TextBox>
...