2011-08-03 8 views
3

CanExecute 대리자로 초기화 된 RelayCommands에 연결된 몇 개의 단추를 사용하고 있습니다.RelayCommand RaiseCanExecuteChanged()가 실패합니다.

RelayCommand DeleteCommand; 
bool CanDelete() 
{ 
    return BoolProp1 && BoolProp2; 
} 

... 

DeleteCommand = new RelayCommand(Delete, CanDelete); 

BoolProp1BoolProp2 제대로 PropertyChanged을 제기 세터와 일반 특성,하지만 우리 모두가 알다시피,이 명령에 SL의 재평가 CanExecute을하는 것만으로는 충분하지 않습니다. 그래서 나는 두 세터 모두 Delete.RaiseCanExecuteChanged()라고도 부릅니다.

이 모든 것이 잘 작동하며 (버튼은 사용 중지되고 올바르게 작동합니다) 어느 지점까지 멈춰 있습니다. 그 시점에서 Delete.RaiseCanExecuteChanged()을 호출하면 CanDelete()에 내 중단 점이 더 이상 발생하지 않으며 단추는 영원히 그대로 유지됩니다.

2 시간 동안 아무런 효과없이 정확한 원인을 찾으려고합니다. 여러 번 RaiseCanExecuteChanged() 단일 "바인딩 반복"호출 메커니즘을 어쨌든 부러 의심.

힌트가 있습니까? 이미

RelayCommandMVVM Light Toolkit에서 실제로 GalaSoft.MvvmLight.Command.RelayCommand입니다

UPDATE ... INotifyPropertyChanged를 통해 새로 추가 IsExecutable 필드를 사용하여 고려 중이 야.

public bool CanExecute(object parameter) 
{ 
    return this._canExecute == null || this._canExecute.Invoke(); 
} 

public void RaiseCanExecuteChanged() 
{ 
    EventHandler canExecuteChanged = this.CanExecuteChanged; 
    if (canExecuteChanged != null) 
    { 
     canExecuteChanged.Invoke(this, EventArgs.Empty); 
    } 
} 

_canExecute이 생성자에 전달 된 값을 한 번 설정 Func<bool> 인과 : ILSpy는 ICommand의의 아주 사소한 구현을 보여줍니다.

아직 문제를 최소한으로 재현하기 위해 노력하고 있습니다.

UPDATE

내 대답을 참조하십시오.

+1

더 많은 코드를 게시하십시오. RelayCommandEx가 무엇입니까? 명령 구현은 어떤 모습입니까? 가능한 경우 매우 간단한 repro을 작성하고 전체 코드를 게시하십시오. –

+0

''RelayCommandEx''는 CanExecute() 값을 캐싱하려하지 않았고 필요하지 않은 경우 CanExecuteChanged를 실행하지 못했습니다. –

+1

나는 막연한 기억이 있는데, 뭔가 (나는 WPF 버튼이라고 생각한다)와 관련이있다. EventHandler와 약한 참조를 캐싱하지 못했다. 시간이있을 때의 모습을 파악하려고 시도하지만 올바른 길로 가는데 도움이 될 수 있습니다. CanExecuteChanged 이벤트에 대한 추가/제거 접근자를 구현 한 다음 제거 지점에 중단 점을 설정하여 제거 시점을 확인할 수 있습니다. – CodeNaked

답변

6

PEBKAC. 어떤 경우에는 내 프레임 워크가 실제로 새로운 인스턴스로보기 위해 바인딩 된 명령을 덮어 쓰는 코드를

DeleteCommand = new RelayCommand(Delete, CanDelete); 

번 이상 실행했습니다.

누군가이 문제가있는 경우 -보기가 바인딩 된 동일한 인스턴스에서 RelayCommand.RaiseCanExecuteChanged()을 호출하고 있는지 확인하십시오.