您好,我正在尝试将 telerik 忙指示器与 MVVM 结合使用。我在主窗口中有忙碌指示器。当窗口中的某个用户控件发生操作(单击按钮)时,用户控件 View 模型会向 MinwindowviewModel 发送一条消息。消息上应显示忙碌指示器。但这是行不通的。为什么这不起作用?
用户控制 View 模型
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());
}
}
用户控制 View 模型是:
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;
}
在主窗口 View 中,根元素是
<telerik:RadBusyIndicator IsBusy="{Binding IsBusy}" telerik:StyleManager.Theme="Windows7">
最佳答案
AccountDetails a = AccountRepository.GetAccountDetailsByID(CustomerId);
是什么意思?做?我的猜测是,无论发生什么,都在 UI 线程上运行。因为这一切都发生在 UI 线程上,所以 UI 永远没有机会刷新并显示 RadBusyIndicator
。尝试将所有工作移至 OnStart
到 BackgroundWorker
,包括发送消息。您将在这里遇到问题,因为消息将从后台线程更新 UI 线程,因此您需要使用 Dispatcher
设置IsBusy
至true
或false
.
关于wpf - telerik 忙指示器不可见,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8509517/