문제

Josh Smith 당 MVVM 패턴을 적용하고 어려움이 있습니다. 나는 여기서 문제를 연구하고 있으며 구문을 꽤 옳게 얻을 수없는 것 같습니다.

아래 코드는 필요한 구문을 따르는 것처럼 보이지만 Visual Studio 보고서 오류 "Delegate 'System.action'은 '2'인수를 취하지 않습니다." 라인에 표시되었습니다.

누군가 내가 어디에서 실수하는지 볼 수 있습니까? 감사!
+톰

    RelayCommand _relayCommand_MoveUp;
    public ICommand RelayCommand_MoveUp
    {
      get
      {
        if (_relayCommand_MoveUp == null)
        {
          _relayCommand_MoveUp = new RelayCommand(
          (sender, e) => this.Execute_MoveUp(sender, e),     **ERROR REPORTED HERE**
          (sender, e) => this.CanExecute_MoveUp(sender, e));
          return _relayCommand_MoveUp;
        }
      }
    }

    private void Execute_MoveUp(object sender, ExecutedRoutedEventArgs e)
    {
      if (_selectedFolder != null)
      {
        _selectedFolder.SelectParent();
      }
    }

    private void CanExecute_MoveUp(object sender, CanExecuteRoutedEventArgs e)
    {
      e.CanExecute = (_selectedFolder != null) && (_selectedFolder.Parent != null);
        }


//And from Josh Smith:

  public class RelayCommand : ICommand
  {
    public RelayCommand(Action<object> execute);
    public RelayCommand(Action<object> execute, Predicate<object> canExecute);

    public event EventHandler CanExecuteChanged;

    [DebuggerStepThrough]
    public bool CanExecute(object parameter);
    public void Execute(object parameter);
  }
도움이 되었습니까?

해결책

RelayCommand는 RoutedCommand가 아니며, 결국 혼란스러워하는 곳이라고 생각합니다.

릴레이 명령의 생성자는 행동 대표 그리고 선택 사항 술어 대표. 이 대표단은 EventArgs를 사용하지 않고 단일 객체 매개 변수 만 사용하므로 오류가 발생합니다. 술어에는 또한 반환 유형의 bool이 필요합니다. RoutedCommand와 마찬가지로 E.canexecute를 설정하는 대신 CanExecute 술어에서 간단히 True/False를 반환합니다.

모습은 다음과 같습니다.

public ICommand RelayCommand_MoveUp
{
  get
  {
    if (_relayCommand_MoveUp == null)
    {
      _relayCommand_MoveUp = new RelayCommand(Execute_MoveUp, CanExecute_MoveUp);

    }
    return _relayCommand_MoveUp;
  }
}

private void Execute_MoveUp(object sender)
{
  if (_selectedFolder != null)
  {
    _selectedFolder.SelectParent();
  }
}

private void CanExecute_MoveUp(object sender)
{
  return (_selectedFolder != null) && (_selectedFolder.Parent != null);
}



편집 (의견에 토론에서 추가) :

WPF 특정 뷰에 뷰 모델을 더 의존하게하는 RoutedCommands와 같은 것을 사용하려면 몇 가지 좋은 옵션이 있습니다.

이것 논의 MVVM을 시작하여 RoutedCommands를 사용한다는 전체 아이디어를 얻었습니다.

그리고 여기에 있습니다 Josh Smith와 Bill Kempf가 제시 한 문제에 대한 매우 견고한 솔루션.

다른 팁

이번 주말 (8 월 22 일) Josh Smith는 MVVMFoundation 프로젝트를 위해 CodePlex로 새로운 변경 사항을 확인하여 릴레이 명령이 매개 변수가있는 대의원의 작동 방식을 변경했습니다. 조심하십시오!

매개 변수를 대의원에게 전달하려면 그의 새로운 릴레이 명령을 사용해야합니다.u003CT> 대신 생성자 :

    public ICommand GotoRegionCommand
    {
        get
        {
            if (_gotoRegionCommand == null)
                _gotoRegionCommand = new RelayCommand<String>(GotoRegionCommandWithParameter);
            return _gotoRegionCommand;
        }
    }
    private void GotoRegionCommandWithParameter(object param)
    {
        var str = param as string;
    }
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top