Relaycommand Lambda 구문 문제
-
23-08-2019 - |
문제
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;
}