【问题标题】:How to pass parameters to command using multibinding?如何使用多重绑定将参数传递给命令?
【发布时间】:2012-02-02 06:27:10
【问题描述】:

我正在使用 MVVM 工具包版本 1。我有两个文本框 textbox1 和 textbox2。按下按钮时,我需要将这两个值作为参数传递,并且需要在名为 textbox3 的第三个文本框上显示结果。

我的虚拟机代码类似这样

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?

【问题讨论】:

    标签: wpf mvvm-toolkit


    【解决方案1】:

    您可以使用多重绑定和转换器

    <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:请检查我的语法 - 它是从我的脑海中写出来的......

    【讨论】:

    • 我也是这样。我正在使用不支持元组的 .net 框架 3.5。所以我只是将它作为对象本身返回。但是当代码到达 CommandExecute 方法时,参数值为空。参数如何获取分配给文本框的值。
    • 在你的转换器中使用:return values.ToArray();
    【解决方案2】:

    您可以在 ViewModel 中创建属性并将其绑定到您需要使用 INotifyPropertyChanged 来通知更改的TextBoxs....

    查看模型

    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>
    

    【讨论】:

    • 感谢您的回复。在我的场景中,我不想将文本框与属性绑定。我想将这些值作为参数传递给带有按钮控件的命令。
    猜你喜欢
    • 1970-01-01
    • 2010-09-11
    • 2012-10-04
    • 2021-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多