ViewModel에 정의 된 RelayCommand를 사용하여 매개 변수 전달 (Josh Smith 예제)

StackOverflow https://stackoverflow.com/questions/810208

문제

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

나는 명령을 withaparameter 방법에서 중단 점을 설정하고 Aparameter가 "Orange"가 아닌 "Apple"으로 설정되었음을 관찰했습니다. 이것은 문자 그대로 문자열 "Apple"으로 호출되는 메소드 명령이 분명해 보입니다.

그러나 실행 스택을 살펴보면 XAML에서 설정 한 명령 파라미터 인 "Orange"가 Icommand Execute Interface 메소드의 릴레이 명령을 구현할 수있는 매개 변수 값임을 알 수 있습니다.

이것이 실행 스택 아래의 방법에서 매개 변수의 값은 "오렌지",

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

내가 알아 내려고하는 것은 XAML에 정의 된 명령 파라미터 "Orange"로 명령을 withaparameter 메소드를 호출 할 수 있도록 릴레이 명령 ACOMMANDWITHAPARAMETER 속성을 만드는 방법입니다.

이것을 할 방법이 있습니까?

왜 이것을하고 싶습니까? 내 특정 구현에서 "On the Fly Localization"의 일부로 여러 버튼에 바인딩 할 수있는 SetLanguage RelayCommand를 만들고 싶습니다. 두 문자 언어 식별자 ( "en", "es", "ja"등을 CommandParameter로 전달하고 XAML에 정의 된 각 "Set Language"버튼에 대해 정의됩니다. 각 언어 지원에 대한 setLanguagetoxxx 명령을 생성하지 않아도되고 두 문자 언어 식별자를 ViewModel의 각 릴레이 명령으로 하드 코딩하지 않아도됩니다.

도움이 되었습니까?

해결책

나는 왜 당신이 처음에 람다를 지정하는 데 더 복잡한 지 이해하지 못합니다. 왜 그렇게하지 않는가 :

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

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

다른 팁

Lambda의 Param을 다음과 같은 명령에 전달할 것입니다.

if (_aCommandWithAParameter == null)
{           
    _aCommandWithAParameter = new RelayCommand(               
        param => this.CommandWithAParameter(param)
        );        
}

나에게 일하기 전에 여기에 게시 된 것은 없습니다.

모든 대답이 누락되었습니다 <object> ~ 후에 RelayCommand!

이것은 나를 위해 작동합니다 :

public RelayCommand<object> OKCommand
{
    get
    {
        if (_okCommand == null)
            _okCommand = new RelayCommand<object>(OkCommand_Execute);
        return _okCommand;
    }
}
private RelayCommand<object> _okCommand = null;

private void OkCommand_Execute(object obj)
{
    Result = true;
}

사용하려면 aCanExecute 메소드, 다음 코드를 사용하십시오.

_okCommand = new RelayCommand<object>(OkCommand_Execute, OkCommand_CanExecute);

private bool OkCommand_CanExecute(object obj) { }

나는 단지 내 요점을 팔려고 노력하고 있습니다. 이것이 효과가 있는지 확인합니다 ...

http://mywpf-visu.blogspot.com/2009/12/relay-command-how-to-pass-parameter.html

다음은 주제에 대한 도움을 찾고있는 CommandParameter에 대한 간단한 솔루션입니다. 온라인에서 충분히 간단한 것을 찾을 수 없었습니다. 다음 솔루션은 계전기를 사용할 때 잘 작동합니다. 명령 매개 변수를 사용하여 클릭 한 URL 값을 얻는 데 필요한 몇 가지 하이퍼 링크가있었습니다.

1 단계 : 릴레이 명령에서 매개 변수 객체 값을 보유하는 간단한 속성을 만듭니다. 당신은 그것을 parametervalue 또는 원하는 이름이라고 부를 수 있습니다.

public object ParameterValue
{
  get;
  set;
}

2 단계 : RelayCommand 클래스의 실행 메소드에서 위의 값 또는 속성을 Execute 메소드의 매개 변수로 설정하십시오.

readonly Action<object> m_execute;       // Action to execute

public void Execute(object parameter)
 {
   this.ParameterValue = parameter;
   m_execute(parameter);
 }

3 단계 : 이제 XAML의 CommandParameter를 명령이 실행될 때 검색하려는 값에 바인딩 할 수있는 경우. 예시:

<TextBlock>
  <Hyperlink Command="{Binding Path=NavigateUrlCmd}"
             CommandParameter="{Binding ElementName=tbwebsite, Path=Text}">
    <TextBlock Name="tbwebsite" Text="{Binding Path=website}"/>
  </Hyperlink>
</TextBlock> 

ChickEncommand라는 명령이 있으면 실행되면 매개 변수에 액세스 할 수 있습니다 : Chickencommand.parametervalue

나는 이것이 누군가를 돕기를 바랍니다. 이전의 모든 도움에 감사드립니다.

컴파일 오류와 함께 Lamda 표현식의 메소드 이름을 참조 할 수 없습니다. 분명히, 그리고 놀랍게도, 비 정적 메소드 이름 참조는 람다 대신 사용할 수 없습니다. 나는 그것을 "추가 된 복잡성"으로 거의 보지 않습니다. 일관되게 Lamdas를 통과하는 것은 나에게 의미가 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top