2011-12-14 70 views
2

嗨我正在嘗試在MVVM中使用telerik Busy指示器。主窗口中有Busy指示器。當窗口中的用戶控件之一發生操作(按鈕單擊)時,用戶控件視圖模型會向MinwindowviewModel發送一條消息。在消息上顯示繁忙指示符。但是這不起作用。爲什麼這不起作用?telerik Busy Indicator不可見

用戶控件查看模型

public class GetCustomerVM : ViewModelBase 
{ 
    private int _CustomerId; 
    public int CustomerId 
    { 
     get { return _CustomerId; } 
     set 
     { 
      if (value != _CustomerId) 
      { 
       _CustomerId = value; 
       RaisePropertyChanged("CustomerId"); 
      } 
     } 
    } 

    public RelayCommand StartFetching { get; private set; } 
    public GetCustomerVM() 
    { 
     StartFetching = new RelayCommand(OnStart); 
    } 

    private void OnStart() 
    { 
     Messenger.Default.Send(new Start()); 
     AccountDetails a = AccountRepository.GetAccountDetailsByID(CustomerId); 
     Messenger.Default.Send(new Complete()); 
    } 
} 

用戶控件視圖模式是:

private bool _IsBusy; 
    public bool IsBusy 
    { 
     get { return _IsBusy; } 
     set 
     { 
      if (value != _IsBusy) 
      { 
       _IsBusy = value; 
       RaisePropertyChanged("IsBusy"); 
      } 
     } 
    } 
    public WRunEngineVM() 
    { 
     RegisterForMessages(); 
    } 

    private void RegisterForMessages() 
    { 
     Messenger.Default.Register<Start>(this, OnStart); 
     Messenger.Default.Register<Complete>(this, OnComplete); 
    } 

    private void OnComplete(Complete obj) 
    { 
     IsBusy = false; 
    } 

    private void OnStart(Start obj) 
    { 
     IsBusy = true; 
    } 

在主窗口視圖,根元素是

<telerik:RadBusyIndicator IsBusy="{Binding IsBusy}" telerik:StyleManager.Theme="Windows7"> 

回答

5

什麼AccountDetails a = AccountRepository.GetAccountDetailsByID(CustomerId);做?我的猜測是,無論發生什麼,都在UI線程上運行。因爲它全部在UI線程上發生,所以UI從來沒有機會刷新並顯示RadBusyIndicator。嘗試將OnStart中的所有工作移至BackgroundWorker,包括髮送郵件。您將遇到問題,因爲消息將從後臺線程更新UI線程,因此您需要使用DispatcherIsBusy設置爲truefalse