Dot-Net

使用 ViewModel 中定義的 RelayCommand 傳遞參數(來自 Josh Smith 範例)

  • May 1, 2009

我想通過使用 RelayCommand 將我的應用程序的 XAML(視圖)中定義的參數傳遞給 ViewModel 類。我關注了 Josh Smith 關於 MVVM 的優秀文章,並實現了以下內容。

XAML 程式碼

       <Button 
       Command="{Binding Path=ACommandWithAParameter}"
       CommandParameter="Orange"
       HorizontalAlignment="Left" 
       Style="{DynamicResource SimpleButton}" 
       VerticalAlignment="Top" 
       Content="Button"/>

視圖模型程式碼

 public RelayCommand _aCommandWithAParameter;
 /// <summary>
 /// Returns a command with a parameter
 /// </summary>
 public RelayCommand ACommandWithAParameter
 {
    get
    {
       if (_aCommandWithAParameter == null)
       {
          _aCommandWithAParameter = new RelayCommand(
              param => this.CommandWithAParameter("Apple")
              );
       }

       return _aCommandWithAParameter;
    }
 }

 public void CommandWithAParameter(String aParameter)
 {
    String theParameter = aParameter;
 }
 #endregion

我在 CommandWithAParameter 方法中設置了一個斷點,並觀察到 aParameter 設置為“Apple”,而不是“Orange”。這似乎很明顯,因為使用文字字元串“Apple”呼叫了 CommandWithAParameter 方法。

但是,查看執行堆棧,我可以看到“橙色”,我在 XAML 中設置的 CommandParameter 是 ICommand Execute 介面方法的 RelayCommand 實現的參數值。

也就是執行棧下面方法中的參數值是“橙色”,

 public void Execute(object parameter)
 {
    _execute(parameter);
 }

我想弄清楚的是如何創建 RelayCommand ACommandWithAParameter 屬性,以便它可以使用 XAML 中定義的 CommandParameter “Orange” 呼叫 CommandWithAParameter 方法。

有沒有辦法做到這一點?

我為什麼要這樣做?“即時本地化”的一部分 在我的特定實現中,我想創建一個可以綁定到多個按鈕的 SetLanguage RelayCommand。我想將兩個字元語言標識符(“en”、“es”、“ja”等)作為 CommandParameter 傳遞,並為 XAML 中定義的每個“設置語言”按鈕進行定義。我想避免必須為每種支持的語言創建一個 SetLanguageToXXX 命令,並將兩個字元語言標識符硬編碼到 ViewModel 中的每個 RelayCommand 中。

我不明白為什麼你首先要指定 lambda 的額外複雜性。為什麼不這樣做:

if (_aCommandWithAParameter == null)
{           
   _aCommandWithAParameter = new RelayCommand<object>(CommandWithAParameter);
}

private void CommandWithAParameter(object state)
{
   var str = state as string;
}

引用自:https://stackoverflow.com/questions/810208