我有一个WPF应用程序,其属性DisplayListType绑定到RadioButton。选择单选按钮将通过调用异步的 MakePatientList() 来更改显示的列表。当 MakePatientList() 完成后,它会更新显示的 DxList 列表,但我认为没有理由在 ListTypes 属性中等待它。但是,确实需要调用它来设置 DxList 属性,如下所示。(注意:如果我不把在启动 MakePatientList() 的属性库中等待)。
ListTypes 中的等待显然是错误的。如何做到这一点?
蒂亚(Visual Studio 2015, .NET 4.6.1)
private ListTypes displayListType;
public ListTypes DisplayListType
{
get { return displayListType; }
set
{
displayListType = value;
OnPropertyChanged("DisplayListType");
switch (value)
{
case ListTypes.ActiveDiagnosis:
await MakePatientList(); <---WRONG??
break;
.......
}
}
}
private async Task MakePatientList()
{
// consume the WCF service.
var result = await MedicalClient.GetActiveDxAsync(Encounter.PatientRecid, (DateTime)Encounter.Tencounter);
dxlist = result.Select(r =>
new ViewDx
{
Cdesc = r.Cdesc,
Code = r.Code,
Chronic = r.Chronic
})
.ToList();
DxList = new ObservableCollection<ViewDx>(dxlist);
}
private ObservableCollection<ViewDx> dxList;
public ObservableCollection<ViewDx> DxList
{
get { return dxList; }
set
{
if (dxList != value)
{
dxList = value;
OnPropertyChanged("DxList");
}
}
}
我写了一篇关于 MVVM 中异步数据绑定的文章,可能会有所帮助。
具体而言,DxList
应该是"异步"数据绑定属性。使用更新的NotifyTask
类型,它看起来像这样:
NotifyTask<ObservableCollection<ViewDx>> DxList { get; set { with notify } }
并更新如下:
private async Task<ObservableCollection<ViewDx>> MakePatientListAsync()
{
var result = await MedicalClient.GetActiveDxAsync(Encounter.PatientRecid, (DateTime)Encounter.Tencounter);
dxlist = result.Select(r =>
new ViewDx
{
Cdesc = r.Cdesc,
Code = r.Code,
Chronic = r.Chronic
})
.ToList();
return new ObservableCollection<ViewDx>(dxlist);
}
public ListTypes DisplayListType
{
get { return displayListType; }
set
{
displayListType = value;
OnPropertyChanged("DisplayListType");
switch (value)
{
case ListTypes.ActiveDiagnosis:
DxList = NotifyTask.Create(() => MakePatientListAsync());
break;
.......
}
}
}
请注意,DxList.Result
现在包含可观察集合(因此需要更新列表框绑定)。还有其他属性挂在DxList
上,例如可以数据绑定到的DxList.IsNotCompleted
,以启用/禁用控件和/或显示/隐藏加载微调器。