使用 ViewModel 中定義的 RelayCommand 傳遞參數(來自 Josh Smith 範例)
我想通過使用 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; }