CanExecute 대리자로 초기화 된 RelayCommands에 연결된 몇 개의 단추를 사용하고 있습니다.RelayCommand RaiseCanExecuteChanged()가 실패합니다.
RelayCommand DeleteCommand;
bool CanDelete()
{
return BoolProp1 && BoolProp2;
}
...
DeleteCommand = new RelayCommand(Delete, CanDelete);
BoolProp1
및 BoolProp2
제대로 PropertyChanged
을 제기 세터와 일반 특성,하지만 우리 모두가 알다시피,이 명령에 SL의 재평가 CanExecute
을하는 것만으로는 충분하지 않습니다. 그래서 나는 두 세터 모두 Delete.RaiseCanExecuteChanged()
라고도 부릅니다.
이 모든 것이 잘 작동하며 (버튼은 사용 중지되고 올바르게 작동합니다) 어느 지점까지 멈춰 있습니다. 그 시점에서 Delete.RaiseCanExecuteChanged()
을 호출하면 CanDelete()
에 내 중단 점이 더 이상 발생하지 않으며 단추는 영원히 그대로 유지됩니다.
2 시간 동안 아무런 효과없이 정확한 원인을 찾으려고합니다. 여러 번 RaiseCanExecuteChanged()
단일 "바인딩 반복"호출 메커니즘을 어쨌든 부러 의심.
힌트가 있습니까? 이미
RelayCommand
가 MVVM 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
내 대답을 참조하십시오.
더 많은 코드를 게시하십시오. RelayCommandEx가 무엇입니까? 명령 구현은 어떤 모습입니까? 가능한 경우 매우 간단한 repro을 작성하고 전체 코드를 게시하십시오. –
''RelayCommandEx''는 CanExecute() 값을 캐싱하려하지 않았고 필요하지 않은 경우 CanExecuteChanged를 실행하지 못했습니다. –
나는 막연한 기억이 있는데, 뭔가 (나는 WPF 버튼이라고 생각한다)와 관련이있다. EventHandler와 약한 참조를 캐싱하지 못했다. 시간이있을 때의 모습을 파악하려고 시도하지만 올바른 길로 가는데 도움이 될 수 있습니다. CanExecuteChanged 이벤트에 대한 추가/제거 접근자를 구현 한 다음 제거 지점에 중단 점을 설정하여 제거 시점을 확인할 수 있습니다. – CodeNaked