2010-06-06 2 views
10

내가 다음 문서를 기반으로 MVVM 패턴을 사용하여 WPF 응용 프로그램, 쓰고 있어요 : WPF Apps With The Model-View-ViewModel Design Pattern의 프로그램에 재평가 "실행할 수있는"상태

내가 버튼 ' "내보기에 두 개의 버튼이를 Command "속성은 RelayCommand 클래스의 주어진 인스턴스 (데이터 바인딩을 사용하여)에 바인딩됩니다 (위의 기사에서"그림 3 RelayCommand 클래스 "참조). RelayCommand 클래스는 주어진 명령을 실행할 수 있는지 확인하는 기능을 지원합니다.

WPF는 명령을 실행할 수없는 단추를 자동으로 비활성화합니다.

ViewModel 클래스의 각 명령은 백그라운드 작업을 시작하고 백그라운드 작업이 끝날 때까지 명령을 다시 실행할 수 없습니다. RelayCommand 인스턴스는 백그라운드 작업이 여전히 작동 중이거나 완료되었는지에 대한 정보를 가지고 있습니다.

내 문제는 다음 중 하나입니다. 배경 작업이 시작되고 작업이 끝날 때까지 명령을 실행할 수 없기 때문에 버튼 중 하나를 누른 후 버튼이 자동으로 비활성화 됨 (OK 임)이지만 작업이 완료되면 명령의 "실행 가능"술어가 자동으로 재평가되지 않기 때문에 버튼이 자동으로 활성화되지 않습니다. 재평가는 응용 프로그램을 느슨하게하고 포커스를 다시 가져 오면 수동으로 트리거 할 수 있습니다 (Alt + Tab을 눌러서). 이 트릭을 한 후에 버튼이 다시 활성화됩니다.

단추의 명령 "실행 가능"상태를 프로그래밍 방식으로 재평가 할 수 있습니까?

답변

20

당신은 CanExecute 다시 조회 할 것을 통지 명령 관리자에 InvalidateRequerySuggested를 호출 할 수

CommandManager.InvalidateRequerySuggested(); 

http://msdn.microsoft.com/en-us/library/system.windows.input.commandmanager.invalidaterequerysuggested.aspx

이것은 특정 ICommand의 구현이 제대로 ICommand.CanExecuteChanged 패턴을 구현했는지 여부에 따라 달라 않습니다 , 그래서 YMMV. DelegateCommand :

업데이트

는 예를 들어, 나는 그것이 자신의 기본 구현 ICommand의의가 프리즘을 사용합니다. 프리즘의 DelegateCommand에서 RaiseCanExecuteChanged()를 호출하면 저에게 효과적입니다.

업데이트 2

그리고 당신은 UI 스레드에서 InvalidateRequerySuggested()를 호출되어 있는지 확인합니다. 필요한 경우 Dispatcher를 사용하여 전화를 겁니다.

+0

이것은 내 첫 번째 추측과 아주 흡사하지만, 나에게 어떤 알려지지 않은 이유로 작동하지 않는 것 같습니다. Idle, Working, PendingStop 등의 프로그램 상태가 변경 될 때마다이 정적 메서드 ("CommandManager.InvalidateRequerySuggested")를 호출합니다. canExecute 처리기에서만 사용되는 상태 속성입니다. 그래도 작동하지 않는 것 같습니다 (동의해야하지만). 예, ICommand 구현을 확인하십시오. 이전에 참조한 그림 3에 나와 있습니다. – dzs

+0

예 ICommand가 실제로 어떻게 구현되었는지에 따라 다릅니다. Prism에서 CanExecute를 다시 쿼리하는 방법을 자세히 설명하는 답변을 업데이트했습니다. 나는 당신이 따르고있는 기사를 볼 것입니다. –

+0

이것은 UI가 아닌 스레드에서 InvalidateRequerySuggested()를 실행하는 것과 관련이 있습니까?Dispatcher를 사용하여 호출하여 UI 스레드에서 호출되도록하십시오. –

관련 문제