Я хотел бы передать параметр, определенный в XAML (View) моего приложения, в класс ViewModel с помощью RelayCommand. Я следовал превосходной статье Джоша Смита о 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». Это кажется очевидным, так как метод CommandWithAParameter вызывается с литеральной строкой «Apple».
Однако, просматривая стек выполнения, я вижу, что "Orange", CommandParameter, который я установил в XAML, является значением параметра для реализации RelayCommand метода интерфейса ICommand Execute.
То есть значение параметра в методе ниже стека выполнения равно "Orange",
public void Execute(object parameter)
{
_execute(parameter);
}
Я пытаюсь выяснить, как создать свойство RelayCommand ACommandWithAParameter, чтобы оно могло вызывать метод CommandWithAParameter с помощью CommandParameter «Orange», определенного в XAML.
Есть ли способ сделать это?
Почему я хочу это сделать? Часть "Локализация на лету"
В моей конкретной реализации я хочу создать SetLanguage RelayCommand, который можно привязать к нескольким кнопкам. Я хотел бы передать двухсимвольный идентификатор языка («en», «es», «ja» и т. Д.) В качестве CommandParameter, и он должен быть определен для каждой кнопки «set language», определенной в XAML. Я хочу избежать необходимости создавать команду SetLanguageToXXX для каждого языка, поддерживающего и жестко кодирующего двухсимвольный идентификатор языка в каждой RelayCommand в ViewModel.