2011-03-19 1 views
4

여러 가지 사용자 지정 명령을 사용하는 도구 모음/메뉴가있는 WPF 응용 프로그램에서 작업 중입니다. 아마 약 15-20. 나는 커스텀 커맨드를 만드는 법에 관한 문서를 보았지만, 그것들 중 어느 것도 필자가하려고하는 것에 반드시 적용되는 것은 아니다.wpf의 사용자 지정 명령

컨트롤러를 사용하여 응용 프로그램의 비즈니스 논리를 처리하고 있으며 모든 논리를 수행하지 않고 내보기를 유지하려고합니다.

내가 뭘하고 싶은건 컨트롤러와 뷰에서 디커플링 할 수 있도록 커스텀 커맨드 클래스를 보유하고있는 프로젝트의 디렉토리를 만드는 것이다.하지만 나는 여전히 뷰와 같은 뷰에서 호출되도록하고 싶다. 정상적인 명령입니다.

나는 또한 DelegateCommand 클래스의 사용을 볼 수 있지만, 내가의 머리에 원하는 방향 인 경우 아주 잘 모르겠습니다있다.

I와 같은 임의의 사용자 지정 명령 클래스를 가질 수 있도록하고 싶습니다 다음

public CustomCommand: ICommandd 
{ 
    public bool CanExecute(object parameter) 
    { 
     //arbitrary logic 
    } 

    public void Execute(object parameter) 
    { 

    } 
} 

아이디어는 내가이 10 ~ 20을 것이라고, 그리고 나는 그들이 다른 모든 것들과 분리 유지하고, 필요할 때 호출 할 갖고 싶어.

내 사용자 지정 명령을 구분할 수있는 방법이 있지만 꽤 확실하지 않습니다.

나는 명령을 처음 사용하기 때문에 개념을 이해하려고 노력 중이다.

덕분에,

답변

1

사용 RelayCommand, 그것은 당신은 단순히 람다 표현식/대표와 생성자에 두 가지 방법을 추가, 각 명령에 대한 클래스를 생성 할 필요가 없습니다.

나는 그것을 내 프로젝트에서 사용하고 있으며, 실시간으로 효과가 있습니다.

4

개념은 버튼에 명령을 바인딩하고이 명령은이 버튼의 두 가지 속성, "클릭시"및 "사용"으로 인해 게시 한 인터페이스를 생성합니다.

명령을 내리는 주된 이유는 버튼 클릭을 뷰 모델의 작업에 바인딩 할 수 있기 때문입니다.

생성자 매개 변수로 작업을 수행하는 하나의 사용자 지정 명령을 만드는 경우보기 모델의 메서드를 명령에 직접 연결할 수 있습니다. 당신이 CanExecute를 연결하려면 뷰 모델에서

public class RelayCommand: ICommandd 
{ 
    Action action; 
    Func<bool> canExecute; 

    public RelayCommand(Action action) : this(action,() => true) {} 
    public RelayCommand(Action action, Func<bool> canExecute) 
    { 
     this.action = action; 
     this.canExecute = canExecute; 
    } 

    public bool CanExecute(object parameter) 
    { 
     return canExecute(); 
    } 

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

사용도 두 번째의 ctor를 사용하고 CanSave 방법을 제공 할 수

public RelayCommand SaveCommand { get; set; } 

SaveCommand = new RelayCommand(OnSave); 

public void Save() 
{ 
    // save logic... 
} 

될 것이다.

public RelayCommand SaveCommand { get; set; } 

SaveCommand = new RelayCommand(OnSave, CanSave); 

public void Save() 
{ 
    // save logic... 
} 

public bool CanSave() 
{ 
    return // ... 
} 

나는 당신의 구현에 명령 매개 변수를 놓았습니다. 이것은 대부분의 경우에 충분할 것이고 핸들러 메소드에 여분의 매개 변수를 저장합니다.10 %의 왼쪽을 위해 내가 대신 액션의 액션을 취하고이 발생할 모든 캐스팅 문제를 저장하는 매개 변수 핸들러

SaveCommand = new RelayCommand<SomeType>(OnSave); 

public void Save(SomeType toSave) 
{ 
    // save logic using parameter 
} 

을 필요로

public void Execute(object parameter) 
    { 
     action((T)parameter); 
    } 

Execute 방법을 변경하는 RelayCommand<T>를 구현 object 변수를 사용하고보기 모델을 안전하게 유지합니다. 나는 다음과 같은 게시물을 통해 내 자신의 질문에 대답 만난다

+0

이 특히 MV-VM 아키텍처, 실제로 명령을 수행하는 매우 유용한 방법이지만, 불행하게도 이것은 내가 아주 것이 아니다 찾고, 만약 당신이 위에서 읽은, 내가 실제로 내보기의 모든 논리를 분리 찾고, 내가이 일을위한 구체적인 이유가, 실제로 내가 뭘 찾았는지 발견 http://www.codeproject.com/KB /WPF/CentralizingWPFCommands.aspx?display=Print - 훌륭한 예제를 위해 Upvote, 감사합니다! – TheJediCowboy

+0

정적 클래스를 통해 명령을 제공하려는 경우에도 RelayCommands를 사용하는 것이 좋습니다. 이렇게하면 xaml 파일의 코드 뒤에 코드가 필요 없으며'_DeleteContact = new RoutedUICommand ("기존 연락처 삭제", "DeleteContact", typeof (MyAppCommands));는 리팩토링을 변경하고 방해 할 수있는 하드 코드 된 문자열을 포함합니다. 나는 당신의 유스 케이스에 관심이있을 것이다. 왜 모든 명령을 하나의 정적 클래스에 넣고 싶습니까? – Zebi