2017-09-28 25 views
1

배경

`ICommand.CanExecuteChanged`를 어떻게 구현해야합니까?

조쉬 스미스의 글을 보면서 약 CommandGroup, 나는 ICommand.CanExecuteChanged을 구현하는 방법에 대한 인터넷에 대한 의견의 숫자가있는 것으로 나타났습니다. 비슷한 질문에 유래에 here을 게시했습니다

하지만

  1. 명확한 응답이 같은 느낌하지 않으며,
  2. 충분히 코멘트에 실 추가 추가 할 수 있도록이 아니다 문맥. 참고로

:

  1. 조쉬 스미스의 원래 article에 대한 CommandGroup
  2. 조쉬 스미스의 RelayCommandCommandManagerimplementation
  3. 마이크로 소프트의 자신 RoutedCommand이의 CommandManagerimplementation를 사용 CanExecuteChanged의를 사용하는 간단한 .NET 이벤트를 사용 CanExecuteChanged
  4. 마이크로 소프트의 PRISM 라이브러리 (버전 : 6) 또한 uses 간단한 .NET 이벤트 (이전 버전을 사용하는 것은 약한 참조)

내 질문

내가 WPF 비교적 새로운 오전, 나는 방법을 알고 싶습니다 예상치 못한 동작이나 메모리 누수를 방지하려면 CanExecuteChanged 이벤트가 Josh Smith의 CommandGroup에 구현되어 있어야합니다.

추가 읽기

Josh Smith: Aggregating WPF Commands with CommandGroup

Josh Smith: WPF apps with the MVVM design pattern

StackOverflow: Is Josh Smith's implementation of the RelayCommand flawed?

StackOverflow: comment about CanExecuteChanged

Microsoft: RoutedCommand

PRISM 6: DelegateCommandBase

답변

0

버튼에 명령을 바인딩한다고 가정 해 보겠습니다. 버튼이 렌더링 될 때 CanExecute()를 호출하고 결과에 따라 Enabled 또는 Disabled 중 하나를 렌더링합니다. "결정합니다"때 WPF가 CanExecute()를 자동으로 호출하지만이 동작에 대해 절대로 릴레이하면 안됩니다.

따라서 ICommand를 구현할 때 결정할 때 해당 이벤트를 발생시키는 UpdateCommand()와 같은 메서드를 선언하십시오. 예를 들어, 버튼을 클릭하면 이전 작업이 완료된 후에 다시 시작해야하는 느린 작업이 시작되면 작업을 시작하기 전에 한 번, 작업이 끝난 후 한 번 두 번 이벤트를 발생시켜야합니다.

"ICommand.CanExecuteChanged를 구현하는 가장 좋은 방법"은 없습니다.아마도 이것은 ICommand의 기본 구현을 프레임 워크와 함께 제공하지 않는 이유의 일부 였을 것입니다. 대부분의 MVVM 프레임 워크는 RelayCommand, ActionCommand, ParameterCommand, AsyncCommand 등 기본 구현을 제공합니다. 그들은 일을 더 쉽게 만듭니다. 대리인을 전달하면 준비가 완료됩니다. 조쉬 스미스 (Josh Smith)의 기사에서는 XAML에서 여러 라우팅 된 명령을 체인 연결하는 방법과 관련된 다른 문제를 해결합니다. 일반적으로

: MVVM

  • 사용 RoutedCommand와

    1. 사용 ICommand의 재사용 가능한 컨트롤을 작성하고 거품까지 시각적 트리에 명령을 원하는, 그래서 관심 존속이 그것을
    2. 을 처리 할 수 ​​있습니다 Decorator 디자인 패턴을 사용하고 모든 명령 ( )을 장식하여 권한이있는 사용자 만 활성화되는 명령, 한 번에 모든 명령을 사용 불가능하게하는 것과 같은 기능의 상위 계층을 추가 할 수 있습니다. 데코레이터가 실제 명령의 CanExecuteChanged 및 re-f 대신에 이벤트를합니다.
  • +0

    의견을 보내 주셔서 감사합니다. 나는 네가하는 말을 들었지만 똑바로 보일 수는 없다. 예를 들어 [Josh Smith의 RelayCommand 구현에 결함이 있습니까?] (https://stackoverflow.com/q/2281566/949681) 기사를 참조하십시오. 이 스레드에는 주제에 대해 앞뒤로 가본 경험이 풍부한 일부 개발자의 의견이 포함됩니다. 생각? – Pressacco