我正在使用 WCF 服务
我有这个问题:
当我在异步函数调用开始时从服务器为我的 GridView 检索数据时,我设置了IsBusy = "True"
. 调用该方法后,我设置IsBusy = "False"
. 在方法调用期间RadBusyIndicator
不显示。我无法理解问题所在。
我已经上传了一个有这个问题的简单项目。你能检查一下吗?下载
如果您的窗口 xaml 不在繁忙指示器内,则它可能不会显示。使用该控件,您需要将繁忙指示器设置为 true 时希望被屏蔽的内容放入指示器标记内。如果您的 UserControl 的主要显示项是 Grid,则将网格包装在忙指示符标记中。
<UserControl>
<telerik:RadBusyIndicator IsBusy={Binding Busy}>
<Grid>
content...
</Grid>
</telerik:RadBusyIndicator>
</UserControl>
这应该会给你你正在寻找的结果。
我在 BackgroundWorker 中移动了加载,你可以试试这个:
private void LoadData()
{
//Activate BudyIndicator
App.Instance.SetBusy();
BackgroundWorker worker = new BackgroundWorker();
worker.DoWork += (o, ea) =>
{
ObservableCollection<CustomerModel> LoadedCustomers = null;
//Create Client
proxy.ServicesClient client = new proxy.ServicesClient();
ObservableCollection<Customer> customers = client.GetCustomers();
LoadedCustomers = new ObservableCollection<CustomerModel>();
foreach (var item in customers)
{
LoadedCustomers.Add(new CustomerModel()
{
CustomerId = item.CustomerId,
Title = item.Title,
FirstName = item.FirstName,
MiddleName = item.MiddleName,
LastName = item.LastName,
CompanyName = item.CompanyName,
SalesPerson = item.SalesPerson,
EmailAddress = item.EmailAddress,
Phone = item.Phone
});
}
client.Close();
//Define return value
ea.Result = LoadedCustomers;
};
worker.RunWorkerCompleted += (o, ea) =>
{
//Get returned value
ObservableCollection<CustomerModel> model = ea.Result as ObservableCollection<CustomerModel>;
if (model != null)
{
Customers = model;
}
//Desactivate BusyIndicator
App.Instance.UnSetBusy();
};
worker.RunWorkerAsync();
}
如果您在控制器上使用 IsBusy 属性的绑定,我假设您是这样,那么您必须实现 INotifyPropertyChanged 接口,以便在更改绑定属性的值时通知 UI 该更改并自行更新。您的视图模型应该有一个带有 setter 的属性,如下所示:
public bool Busy
{
get{return _Busy;}
set
{
if(value != _Busy)
_Busy = value;
OnPropertyChanged("Busy");
}
}
这将通知 UI 更改;如果您已经这样做了,那么我将需要查看更多相关代码以提供更多帮助。
在我再次查看您的上一篇文章之后,如果您将 IsBusy 属性设置为字符串值,这是您的问题,因为该属性采用布尔值。
好的,我看到了你的问题。代理上的 Close 方法等待异步调用的结果。只需移动您的 client.Close(); 在 GetCustomersCompleted 方法中,这将起作用。(用您的样品测试)
private proxy.ServicesClient client = null;
private void LoadData()
{
App.Instance.SetBusy();
client = new proxy.ServicesClient();
client.GetCustomersCompleted += (s, e) =>
{
if (e.Error != null)
{
throw new Exception();
}
else
{
Customers = new ObservableCollection<CustomerModel>();
foreach (var item in e.Result)
{
Customers.Add(new CustomerModel()
{
CustomerId = item.CustomerId,
Title = item.Title,
FirstName = item.FirstName,
MiddleName = item.MiddleName,
LastName = item.LastName,
CompanyName = item.CompanyName,
SalesPerson = item.SalesPerson,
EmailAddress = item.EmailAddress,
Phone = item.Phone
});
}
OnPropertyChanged("Customers");
}
client.Close();//Close after the return
App.Instance.UnSetBusy();
};
client.GetCustomersAsync();
//client.Close();
}
}
我假设根据您的代码,您希望只将繁忙指示器放在主窗口的内容控件上。我的建议是为主窗口创建一个视图模型并将其用作页面的数据上下文。如上所述,我还将在视图模型上设置一个属性,并设置到该属性的绑定。在视图模型中,您可以对数据存储进行异步调用,并在返回时填充集合属性(推荐 ObservableCollection)并将您的 ListBox 的 IitemsSource 属性绑定到该属性。我希望这有帮助