2013-06-18 1 views
0

ViewModel에 속성 IEnumerable<MyObject> MyObjects이 있습니다. MyObjects이 적어도 하나의 객체로 채워지지만 실행 가능하지 않은 경우 실행 가능하도록 두 번째 뷰 모델 (첫 번째 참조)에서 특정 명령을 실행 가능하게하려고합니다.WPF는 지속적으로 리퀘스트를 수행 할 수 있습니다.

private bool CanExecute() 
{ 
    return this.viewModel.MyObjects.Any(); 
} 

내가 MyObjects의 기본 값이 변경 될 때마다 제기되는하여 PropertyChanged 이벤트가 :

내 CanExecute 방법은 다음과 같이 보인다.

논리는 올바르게 작동하지만 CanExecute() 메서드는 계속 호출되고 있으므로 기본적으로 전체 응용 프로그램이 고정됩니다. 동시에 MyObjects는 변경되지 않습니다 (또한 PropertyChanged 이벤트를 발생시키지 않습니다). CanExecute가 끊임없이 다시 질의되는 것을 막을 수있는 아이디어는 없습니까?

+1

아마도 불필요한 이벤트의 원인을 찾아야합니다. –

+0

명령이 바인딩 된 컨트롤에 따라 특정 이벤트가 CanExecute를 확인하도록 지시하면 명령이 실행됩니다. 나는 이것이 CommandManager.RequerySuggested와 관련이 있다고 생각한다. – Alan

답변

1

난 당신의 명령을 가정 중 하나 RoutedCommand을 상속하거나이 같은 CanExecuteChanged을 구현 해요 :에 핸들러를 추가하는 의미

public event EventHandler CanExecuteChanged { 
    add { CommandManager.RequerySuggested += value; } 
    remove { CommandManager.RequerySuggested -= value; } 
} 

명령의 CanExecuteChanged (당신의 CanExecute를 호출 할 때 WPF가 수행하는 결정하는) CommandManager.RequerySuggested에 추가하는 것과 같습니다. 매우 자주 제기되며, 자주 발생시키지 않는 방법은 없습니다.

  1. 그냥 CanExecuteChanged 표준 이벤트를하고 당신이 그것을 확인하고자 할 때 특별히 인상, 모든 RequerySuggested를 사용하지 마십시오 :

    이 문제를 해결하려면 두 가지 방법이있다.

  2. CanExecute 메서드가 매우 빠르므로 실행 빈도는 중요하지 않은지 확인하십시오. return this.viewModel.HasAnyObjects;으로 쓸 수 있습니다. HasAnyObjectsMyObjects이 변경되면 true 또는 false로 설정된 간단한 필드입니다.

+0

감사합니다. 의심되는대로 CanExecuteChanged를 구현했습니다. 지금 옵션 # 2를 선택하고 문제를 해결했습니다. – Andrew

관련 문제