내가 다음 문서를 기반으로 MVVM 패턴을 사용하여 WPF 응용 프로그램, 쓰고 있어요 : WPF Apps With The Model-View-ViewModel Design Pattern의 프로그램에 재평가 "실행할 수있는"상태
내가 버튼 ' "내보기에 두 개의 버튼이를 Command "속성은 RelayCommand 클래스의 주어진 인스턴스 (데이터 바인딩을 사용하여)에 바인딩됩니다 (위의 기사에서"그림 3 RelayCommand 클래스 "참조). RelayCommand 클래스는 주어진 명령을 실행할 수 있는지 확인하는 기능을 지원합니다.
WPF는 명령을 실행할 수없는 단추를 자동으로 비활성화합니다.
ViewModel 클래스의 각 명령은 백그라운드 작업을 시작하고 백그라운드 작업이 끝날 때까지 명령을 다시 실행할 수 없습니다. RelayCommand 인스턴스는 백그라운드 작업이 여전히 작동 중이거나 완료되었는지에 대한 정보를 가지고 있습니다.
내 문제는 다음 중 하나입니다. 배경 작업이 시작되고 작업이 끝날 때까지 명령을 실행할 수 없기 때문에 버튼 중 하나를 누른 후 버튼이 자동으로 비활성화 됨 (OK 임)이지만 작업이 완료되면 명령의 "실행 가능"술어가 자동으로 재평가되지 않기 때문에 버튼이 자동으로 활성화되지 않습니다. 재평가는 응용 프로그램을 느슨하게하고 포커스를 다시 가져 오면 수동으로 트리거 할 수 있습니다 (Alt + Tab을 눌러서). 이 트릭을 한 후에 버튼이 다시 활성화됩니다.
단추의 명령 "실행 가능"상태를 프로그래밍 방식으로 재평가 할 수 있습니까?
이것은 내 첫 번째 추측과 아주 흡사하지만, 나에게 어떤 알려지지 않은 이유로 작동하지 않는 것 같습니다. Idle, Working, PendingStop 등의 프로그램 상태가 변경 될 때마다이 정적 메서드 ("CommandManager.InvalidateRequerySuggested")를 호출합니다. canExecute 처리기에서만 사용되는 상태 속성입니다. 그래도 작동하지 않는 것 같습니다 (동의해야하지만). 예, ICommand 구현을 확인하십시오. 이전에 참조한 그림 3에 나와 있습니다. – dzs
예 ICommand가 실제로 어떻게 구현되었는지에 따라 다릅니다. Prism에서 CanExecute를 다시 쿼리하는 방법을 자세히 설명하는 답변을 업데이트했습니다. 나는 당신이 따르고있는 기사를 볼 것입니다. –
이것은 UI가 아닌 스레드에서 InvalidateRequerySuggested()를 실행하는 것과 관련이 있습니까?Dispatcher를 사용하여 호출하여 UI 스레드에서 호출되도록하십시오. –