2012-03-27 3 views
1

내 명령이 입니다. wpf 앱이 시작될 때 CanExecute 메서드가 한 번만 호출되었습니다. 나는 그 방법을 주기적으로 재평가 할 수 있기를 원한다. CommandManager.InvalidateRequerySuggested()을 프로그래밍 방식으로 호출하거나 DispatcherTimer으로 호출하는 방법을 찾았습니다. 나와 CanExecute는 앱 수명 기간에 한 번만 호출됩니다.CommandManager.InvalidateRequerySuggested() 작동하지 않습니다.

누구든지 수정 사항을 알고 계십니까?

-pom-

+0

'Application.Current.Dispatcher.Invoke?'를 통해 전화해야 할 수도 있습니다. http://stackoverflow.com/a/15828850 – Benjol

답변

3

내가 그 기술에 대해 읽었습니다,하지만 내가 사용했던 하나 아니에요 아니면 제가 일반적으로 사용되는 생각합니다. 일반적으로 프리즘의 DelegateCommand 또는 MVVM 라이트의 RelayCommand를 사용합니다. 이들은 CanExecuteChanged 이벤트를 가진 ICommand를 구현합니다. 그러면보기 모델의 상태가 변경 될 때이 이벤트를 발생시킬 책임이 있습니다.

public class MyViewModel 
{ 
    DelegateCommand _myCommand; 

    public MyViewModel() 
    { 
     _myCommand = new DelegateCommand(ExecuteMyCommand, CanExecuteMyCommand); 
    } 

    public ICommand MyCommand 
    { 
     get{ return _myCommand; } 
    } 

    private void ExecuteMyCommand(){ ... } 
    private bool CanExecuteMyCommand() { return true/false; } 

    // for example 
    public int SomeProperty 
    { 
     get{ ... } 
     set{ 
     ...; 
     if(...){ 
      _myCommand.RaiseCanExecuteChanged(); 
     } 
     } 
    } 
} 

내가 도움이 되었으면 좋겠다.

+0

답해 주셔서 감사합니다. 비 프레임 워크 (non-framework) 응답이 나오지 않는 한 며칠 안에이를 받아 들일 것입니다. 감사. – Pompair

+0

불행히도 적어도 MVVMLight의 RelayCommand는 내부적으로 CommandManager.InvalidateRequerySuggested를 사용하므로 RaiseCanExecuteChanged 또는 명령 관리자의 차이점이 없습니다. (나는 코멘트에 실제 코드를 게시하려했지만 외형은 포맷팅을하지 않지만 디 컴파일을 시도하면 내가 무슨 뜻인지 알 수있다) – Almund