2013-10-30 2 views
1

UI 구성 요소의 가시성이 ViewModel 등록 정보에 바인드되고 해당 등록 정보의 PropertyChanged가 구현되었지만 UI가 자체 업데이트를 건너 뛸 수 있습니까?UI가 업데이트되지 않음 MVVM을 사용하여 PropertyChanged

보기/XAML :

<Border Visibility="{Binding ShowLoadingPanel, Converter={StaticResource BoolToHiddenConverter}}"> 
     <TextBlock Text="LOADING..." /> 
</Border> 

뷰 모델 :

Public Property ShowLoadingPanel As Boolean 
    Get 
     Return _showLoadingPanel 
    End Get 
    Set(value As Boolean) 
     _showLoadingPanel = value 
     OnPropertyChanged("ShowLoadingPanel") 
    End Set 
End Property 

는 뷰 모델에서 다음 실행 :

ShowLoadingPanel = True 
RunBigTask() 'runs a task that takes a long time 
ShowLoadingPanel = False 

을 ... XAML에 정의 된 테두리가되지 않습니다 명백한. 내가 좋아하는, 예를 들어 사용자 상호 작용을 필요로 무언가를 추가 할 경우

는하지만 :

ShowLoadingPanel = True 
MsgBox("Click to continue") 
RunBigTask() 'runs a task that takes a long time 
ShowLoadingPanel = False 

원하는대로 ... 그 경계가 표시됩니다.

어떻게 가능합니까? 그것은 Visibility를 업데이트에서 UI 스레드를 차단하기 때문에 그대로 장기 실행 작업이 완료되면

답변

2

Dispatcher를 차단하여 레이아웃이 업데이트되지 않도록합니다. 메시지 상자를 열면 메시지 상자가 닫힐 때까지 Dispatcher가 대기열 처리를 계속할 수 있도록 중첩 된 메시지 루프를 푸시합니다. 이 기간 동안 레이아웃 업데이트가 발생합니다.

일반 창에서 ShowDialog()을 호출하면 코드 차단이 발생하지만 Dispatcher가 계속 실행되어 UI가 예상대로 업데이트됩니다. 메시지 상자 같은 모달 대화 상자를 닫을 때 자동으로 발생하는 중첩 된 메시지 루프가 팝업 될 때까지 코드가 다시 시작되지 않습니다.

4

당신은 정말 ... 백그라운드 스레드에서 Visibility해야 업데이 트를하여 장기 실행 작업을 실행해야합니다.

사용자가 BackgroundWorker 개체를 사용하는 것이 일반적입니다. MSDN의 BackgroundWorker Class 페이지에서 전체 작동 예제를 찾을 수 있습니다.

BackgroundWorker의 일반적인 대안은 Task 개체를 사용하여 장기 실행 프로세스를 비동기 적으로 실행하는 것입니다. MSDN의 Task Class 페이지에서 Task을 사용하는 전체 작동 예제를 찾을 수 있습니다.

+0

예, 장기 실행 작업에 백그라운드 스레드를 사용해야합니다. 나는 왜 UI가 ShowLoadingPanel = True 변경을 캐치하지 않는 단일 스레드에서 오랫동안 실행되는 작업이 시작되기 전에 여기에서 시작해야하는지 궁금해했다. 프로그램이 UI를 따라 잡기에는 너무 빠르다 ... 나는 그렇지 않다. 알 겠어. – Nuts

+0

죄송합니다. 이전에 귀하의 의견에 답변했지만 웹 사이트에 오류가 있었음에 틀림 없습니다. @MikeStrobel이 말한 것 외에 프로그램 실행이 한 줄씩 실행됩니다. 다시 실행할 선이 없어 질 때까지 UI에 제어권을 다시주지 않습니다. 우리는 백그라운드 스레드에서 비동기 메서드 및/또는 실행 코드를 사용하여 이러한 상황을 강제 할 수 있습니다. [또는 Mike가 말한 것처럼 [MessageBox]를 표시합니다. – Sheridan

관련 문제