2017-03-15 27 views
3

ビジーインジケータが機能していないようです。データをロードする前にIsBusyフラグをtrueに設定しています。データのロードが完了すると、 が表示されますが、インジケータは表示されません。以下は私のコードスニッピです。UserControlとViewModelを使用したWPFのBusyIndi​​cator

<UserControl ... 
xmlns:WPFTool="clr-namespace:Xceed.Wpf.Toolkit;assembly=Xceed.Wpf.Toolkit"> 

<i:Interaction.Triggers> 
    <i:EventTrigger EventName="Loaded"> 
     <i:InvokeCommandAction Command="{Binding FormLoadCompleteCommand}"/> 
    </i:EventTrigger> 
</i:Interaction.Triggers> 

<Grid> 

    .... 

    <WPFTool:BusyIndicator Name="BusyInd" BusyContent="Loading Servers" IsBusy="{Binding IsBusy}"/> 
</Grid> 
</UserControl> 


public class MyViewModelForUserControl : ViewModelBase 
{ 

    private bool _isBusy; 
    public bool IsBusy { get { return _isBusy; } set { _isBusy = value; RaisePropertyChanged("IsBusy"); } } 


    private DelegateCommand _formLoadCompleteCommand; 
    public DelegateCommand FormLoadCompleteCommand 
    { 
     get 
     { 
      if (_formLoadCompleteCommand == null) 
       _formLoadCompleteCommand = new DelegateCommand(FormLoadComplete); 
      return _formLoadCompleteCommand; 
     } 
    } 


    private void FormLoadComplete(object parameter) 
    { 
     IsBusy = true; 
     LoadData(); 
     IsBusy = false; 
    } 
} 
+2

'LoadData()'は同期していますか(質問に追加してください)?あなたはUIの期間をブロックしているので、 'IsBusy'の変更は最後のものだけ(' IsBusy = false; ')ビューによってレンダリングされません。 – Sinatr

答えて

1

これを試してみてください:

private void FormLoadComplete(object parameter) 
    { 
     IsBusy = true; 
     Task.Run(() => 
     { 
      LoadData(); 
      Application.Current.Dispatcher.Invoke(() => IsBusy = false); 
     }); 
    } 

は、あなたが最初のイベントハンドラを残していないUIスレッド上でLoadDataを実行する必要があります。

+0

私はあなたがApplication.Current.Dispatcherを意味すると仮定します。もしそうなら、これも動作しません。 FormLoadCompleteが終了するのを待ちます。 – mehwish

+0

LoadData {..Application.Current.Dispatcher.Invoke(>)=> IsBusy = false;)の最後に、Task.Run(()=> LoadData())を実行してみてください。 } – Rekshino

+0

これは働いた。ありがとうございました。 – mehwish

関連する問題