【问题标题】:Passing two command parameters on button click on WPF NET 3.5 MVVM在按钮上传递两个命令参数单击 WPF NET 3.5 MVVM
【发布时间】:2017-07-20 15:39:18
【问题描述】:

我正在尝试将按钮单击时的两个 ICommand 参数传递给视图模型中的方法。

现在我只能传递一个参数。

代码在这里。

XAML(视图)

<Button x:Name="btnAdd" Command="{Binding AddUserCommand}" 
                        CommandParameter="{Binding IDUser}"/>

查看模型

    public string IDUser
    {
        get
        {
            return this.personalData.UserID;
        }

        set
        {
            if (this.personalData.UserID == value)
            {
                return;
            }

            this.personalData.UserID = value;
            OnPropertyChanged("UserID");
        }
    }


    private RelayCommand addUserCommand;
    public ICommand AddUserCommand
    {
        get
        {
            return addUserCommand ??
                (addUserCommand = new RelayCommand(param => this.AddUser(param.ToString())));
        }
    }

    public vol AddUser(string userId)
    {
         // Do some stuff
    }

现在我想在按钮单击时传递另一个 ICommand 参数。 我要传递的参数是复选框中的值(选中与否)。

<CheckBox x:Name="Status" Content="Married"/>

因此视图模型中的方法 AddUser 将具有以下签名:

    public vol AddUser(string userId, bool status)
    {
         // Do some stuff
    }

我知道可以将 MultiBinding 与转换器结合使用来完成,但我不知道具体该怎么做。我也不明白为什么在使用多重绑定时需要转换器。

【问题讨论】:

  • 虽然绑定可能比您想要的更冗长,但它也可能是正确的方法。如果您确实需要转换器,您需要它的原因与从方法返回 (DTO) 对象的原因相同:因为该方法只能返回一件事。
  • 也许是一个很好的post 来回答为什么在使用多重绑定时需要转换器。
  • 为什么复选框没有绑定到您的视图模型?如果是,您可以简单地查看值。
  • @user1624552 绑定您希望在 WPF 中持久保存的任何值是一个好主意。 WPF 通常会卸载不可见的控件,因此有时您会因未绑定的值而出现奇怪的行为。例如,如果在 TabControl 上您可以更改选项卡并返回,并且所有未绑定的数据都将重置,因为该控件已卸载或重新加载。或者有时在最小化应用程序并恢复它时,它会重置所有内容,因为它卸载并重新加载了控件。
  • 我理解这种感觉。你所要求的是可能的,有点,但并非没有很多繁重的工作,这真的不会让你买太多。

标签: c# wpf mvvm icommand multibinding


【解决方案1】:

一个命令只接受一个参数。 ICommand接口的Execute方法定义为:

void Execute(object parameter);

所以你不能将两个参数传递给一个命令。

您可以做的是传递一个具有两个属性的类的实例。这就是多转换器的用武之地。

CommandParameter绑定到两个属性,并使用转换器返回一个对象。

XAML:

<Button x:Name="btnAdd" Command="{Binding AddUserCommand}">
    <Button.CommandParameter>
        <MultiBinding Converter="{StaticResource yourConverter}">
            <Binding Path="IDUser" />
            <Binding Path="IsChecked" ElementName="Status" />
        </MultiBinding>
    </Button.CommandParameter>
</Button>

转换器:

public class Converter : IMultiValueConverter
{
    public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
    {
        return new YourClass() { IdUser = values[0] as string, IsChecked = System.Convert.ToBoolean(values[1]) };
    }

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

查看模型:

private RelayCommand<YourClass> addUserCommand;
public ICommand AddUserCommand
{
    get
    {
        return addUserCommand ??
            (addUserCommand = new RelayCommand<YourClass>(param => this.AddUser(param)));
    }
}

public vol AddUser(YourClass obj)
{
    string IDUser = obj.IDUser;
    bool isChecked = obj.IsChecked;
    // Do some stuff
}

当然你还必须用IDUserIsChecked这两个参数定义YourClass载荷类型。

【讨论】:

  • @user1624552:你试过了吗?
猜你喜欢
  • 2017-11-24
  • 2023-03-19
  • 1970-01-01
  • 1970-01-01
  • 2016-08-21
  • 2014-01-01
  • 2013-09-08
  • 1970-01-01
  • 2015-06-07
相关资源
最近更新 更多