2016-06-05 2 views
0

Ich habe eine WPF-Anwendung mit der Eigenschaft DisplayListType an einen RadioButton gebunden. Durch Auswahl des Optionsfelds wird die angezeigte Liste geändert, indem MakePatientList() aufgerufen wird, das asynchron ist. Wenn MakePatientList() beendet ist, aktualisiert es die angezeigte Liste von DxList aber ich sehe keinen Grund, in der ListTypes-Eigenschaft darauf zu warten. Allerdings muss aufgerufen werden, um die DxList-Eigenschaft festzulegen, wie unten gezeigt. (Hinweis: Visual Studio beschwert sich, wenn ich in dem Eigenschaftensetter ablegen, in dem MakePatientList() gestartet wird).Ändern einer angezeigten Liste asynchron von einem Radiobutton

Die erwarten in ListTypes ist eindeutig falsch. Wie kann das gemacht werden?

TIA (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"); 
       } 
      } 
     } 

Antwort

2

Ich schrieb ein article on async data-binding in MVVM die hilfreich sein können.

Insbesondere sollte die DxList eine "asynchrone" datengebundene Eigenschaft sein. Mit dem NotifyTask type aktualisiert, würde es in etwa so aussehen:

NotifyTask<ObservableCollection<ViewDx>> DxList { get; set { with notify } } 

und aktualisiert als solche:

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; 
     ....... 
    } 
    } 
} 

Beachten Sie, dass DxList.Result nun die beobachtbaren Sammlung enthält (so müssen Sie Ihre listbox Bindungen aktualisieren). Es hängen auch andere Eigenschaften von DxList wie DxList.IsNotCompleted, an die Sie Daten binden können, um Steuerelemente zu aktivieren/deaktivieren und/oder Loading-Spinner anzuzeigen/auszublenden.

Verwandte Themen