2017-07-20 45 views
-2

我想通過按鈕上的兩個ICommand參數點擊視圖模型中的方法。傳遞兩個命令參數上的按鈕點擊WPF NET 3.5 MVVM

現在我只能傳遞一個參數。

代碼在這裏。

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進行結合轉換器,但我不知道究竟該怎麼做。此外,我不明白爲什麼使用多重綁定時轉換器是必需的。

+2

雖然綁定可能比您想要的更冗長,但它也可能是正確的選擇。如果你確實需要一個轉換器,你需要它的原因是你會從一個方法返回一個(DTO)對象:因爲該方法只能返回一件事情。 –

+1

也許一個很好的[發佈](https://stackoverflow.com/questions/15759308/do-you-have-to-use-a-converter-when-using-multibinding-in-wpf)回答_爲什麼一個轉換器是使用多重綁定時需要._ –

+1

爲什麼複選框未綁定到您的視圖模型?如果是這樣,你可以簡單地看看價值。 – Will

回答

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

+0

@ user1624552:你試過這個嗎? – mm8