2016-04-06 18 views
0

私はuiアップデートの問題に遭遇しました。私は機能を実行できるようにしたい、機能の内側に長い時間がかかるコールBがあるので、機能Aの実行は、私がProgressViewにビューを変更したい関数Bに来たとき、およびshowオンザフライで進歩する。MVVMでアクションを実行する前にUIを強制的に更新する方法はありますか?

何私が達成したい:Aの

  • 実行が
  • 機能Bが
  • と呼ばれる始まる関数へ

    • コール機能Bは、ProgressDialogを開き、 機能Aながら進行状況を表示処理するのを待っている
    • ファンクションBが終了する
    • 機能Aを続けることができ3210機能Aは私がUIを更新したい場合、私はUIスレッド上でアクションを実行するアプリケーションディスパッチャを使用する必要があることが分かった

    終了します。

    関数B:

    Public Sub ShowWaitingScreen(workItems As List(Of WorkItem)) Implements IViewsLogic.ShowWaitingScreen 
        Dim waiting As WaitingDialogViewModel = New WaitingDialogViewModel(workItems, Sub() HideDialog()) 
    
        Application.Current.Dispatcher.Invoke(DispatcherPriority.Background, Sub() 
                         _shell.DialogViewModel = waiting 
                            waiting.StartWorker 
                        End Sub) 
    
    
    End Sub 
    
        Public Class WaitingDialogViewModel 
         Inherits ViewModelBase 
         Implements IDialog 
         Public Sub New(workItems As List(Of WorkItem), completeAction As Action) 
          _completeAction = completeAction 
          _workItems = workItems 
          ProgressValue = 0 
          StatusMessage = "Preparing" 
         End Sub 
    
         'Private WithEvents _worker As BackgroundWorker 
         Private _completeAction As Action 
         Private _progressValue As Integer 
         Private _statusMessage As String 
         Private ReadOnly _workItems As List(Of WorkItem) 
    
         Public Property ProgressValue As Integer 
          Get 
           Return _progressValue 
          End Get 
          Set(value As Integer) 
    
           _progressValue = value 
           Application.Current.Dispatcher.Invoke(DispatcherPriority.Background, Sub() 
                             RaisePropertyChanged(Function() ProgressValue) 
                            End Sub) 
          End Set 
        End Property 
    
        Public Sub StartWorker() 
         For i As Integer = 1 To _workItems.Count() 
          ReportProgress(Convert.ToInt32(Math.Ceiling(100/(i + 1))), "Executing " + i.ToString() + " out of " + _workItems.Count().ToString()) 
          _workItems(i - 1).WorkerAction.Invoke() 
         Next 
         ReportProgress(100, "Dome") 
         _completeAction.Invoke() 
        End Sub 
    
    
        Public Property StatusMessage As String 
         Get 
          Return _statusMessage 
         End Get 
         Set(value As String) 
          _statusMessage = value 
          Application.Current.Dispatcher.Invoke(DispatcherPriority.Background, Sub() 
                            RaisePropertyChanged(Function() StatusMessage) 
                           End Sub) 
         End Set 
        End Property 
    
        Private Sub ReportProgress(progress As Integer, text As String) 
         ProgressValue = progress 
         StatusMessage = text 
        End Sub 
    
    End Class 
    

    私が今直面しています問題は、時々WaitingDialogViewModelが示され、結果が矛盾していることを、時にはそのではありません。進行状況の実行を開始する前にUIの更新を強制するにはどうすればよいですか?

  • 答えて

    0

    ビューモデルは、PropertyChangedイベントを呼び出して、UI要素に更新する必要があることをUI要素に通知する必要があります。 PropertyChangedEventArgsに特定の小品名を指定しないと(つまり、nullを渡すだけの場合)、すべてバウンドコントロールが更新されます。

    関連する問題