从单选按钮异步更改显示的列表



我有一个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,以启用/禁用控件和/或显示/隐藏加载微调器。

最新更新