2013-08-23 4 views
3

'실행'버튼, 결과 컨트롤 및 처리 컨트롤과 같은 3 개의 컨트롤이있는 사용자 창이 있습니다. 필자의 목표는 execute 키를 누른 후에 처리 컨트롤을 표시 한 다음 execute 메서드가 끝나면 숨 깁니다.WPF 컨트롤 가시성 및 명령 및 OnPropertyChanged

그러나 처리 제어가 표시되지 않습니다 ... 대신 사용자 입력을 요구하는 다른 윈도우를 만드는 콜백 함수가 호출 될 때만 표시됩니다.

처리 컨트롤의 가시성이 BoolToVis 변환기를 통해 내 viewmodel의 Processing 바운드에 바인딩됩니다. execute 메서드는 시작시 Processing을 true로 설정하고 완료되면 false로 설정합니다. 내보기 모델 INotifyPropertyChanged.

private bool _processing; 
    public bool Processing 
    { 
     get 
     { return _processing; } 
     set 
     { 
      _processing = value; 
      this.OnPropertyChanged("Processing"); 
     } 
    } 

    private RelayCommand _search; 
    public RelayCommand Search 
    { 
     get { return _search ?? (_search = new RelayCommand(p => OnSearch(), p => CanSearch())); } 
    } 
    private void OnSearch() 
    { 
     this.Processing = true; 

     DoWork(delegate callBack); 

     this.Processing = false; 
    } 

를 구현하고 OnPropertyChanged.Processing의 세터는 호출 XAML의 일부 :

<BooleanToVisibilityConverter x:Key="BoolToVis" /> 

    <me:ProcessingControl Visibility="{Binding Path=Processing, Converter={StaticResource ResourceKey=BoolToVis}}"/> 
+4

'BackgroundWorker'또는를 사용하여 백그라운드 스레드에서'DoWork()'메소드를 실행해야합니다. TPL의'Task '을 사용하거나 C# 5 (VS 2012)를 사용하고 있다면 이것을 '기다릴 수 있습니다.' –

+0

나는 그것을 시도 할 것이다. 그러나 나의 호기심은 여전히 ​​남아 있습니다. DoPro()에 도달하기 전에 OnPropertyChanged를 통해 제어 흐름과 UI를 업데이트하지 않아야합니까? – Michael

+1

아니요, UI 스레드가 DoWork() 메서드를 실행 중일 때 바쁘게 유지하므로 코드가 실행을 완료 할 때까지 UI를 새로 고칠 수 없기 때문입니다. –

답변

0
를 사용하여 작업 또는 배경 작업자가 DoWork을 할

, 작업 또는 배경을 시작하기 전에 처리가 = true로 설정 작업자가 작업이 끝날 때 거짓으로 만듭니다. 처리 컨트롤이 표시되고 숨겨집니다. bool 값을 묶어서 처리하는 경우 작업 또는 백 그라운드 작업자에서 처리하는 경우 dispatch를 통해 호출해야합니다.