3 Stimmen

Silverlight und MVVM: Laden von Daten aus einem Web-Service in der VM

Ich versuche, das viewModel (VM) einzurichten, um die Logik zu enthalten, die Daten von einem Webdienst zu erhalten und dann die Daten in das Modell zu laden, die dann über das ViewModel in der Ansicht angezeigt werden würde.

ViewModel

public StudentViewModel : INotifyPropertyChanged
{
    private List<Student> _students;
    public List<Student> Student
    {
        get{.....}
        set{.....}
    }

    public StudentViewModel()
    {
        //call webservice and load the data into Students
    }    
}

Siehe

den Datenkontext auf das oben definierte viewModel setzen

<UserControl DataContext=..... />

Problem

Weil ich den Webdienst aus dem ViewModel ctor aufrufe, denke ich, dass der VisualStudio-Designer einen Anfall wirft. Nun, ich könnte eine Load-Methode auf meine VM von der Ansicht PageLoad-Methode aufrufen, aber ich frage mich, ob es einen besseren Weg, um dieses Problem zu behandeln ist?

Grund

Der Grund dafür, dass ich Schüler in den CTOR lade, ist, dass ich die Liste der Schüler beim ersten Laden der Ansicht anzeigen möchte.

2voto

Jehof Punkte 33506

Sie sollten eine Prüfung der Eigenschaft IsInDesignMode der Datei DesignerEigenschaften Klasse in Ihrem Konstruktor.

Wenn IsInDesignMode den Wert false zurückgibt, sollten Sie Ihre Studenten von Ihrem Webservice laden. Wenn Sie sich im DesignMode befinden, können Sie Dummy-Objekte konstruieren, um Ihr Viewmodel mit DesignTime-Daten zu initialisieren.

public class StudentViewModel : INotifyPropertyChanged{

    public StudentViewModel() {
       if (DesignerProperties.IsInDesignMode) {
         // constructor dummy objects or initialize your viewmodel with DesignTime values
       }
       else {
         // initialize viewmodel with data from webservice
       }

    }

    // rest of the class
  }

1voto

Rafal Spacjer Punkte 4718

Verwenden Sie ServiceLocator für die Erstellung von ViewModels?

Ich denke, Sie können Ihr Problem mit ServiceLocator lösen. Locator kann ein neues ViewModel-Objekt erstellen, den Webdienst aufrufen (im asynchronen Modus) und die VM zurückgeben. In der VM können Sie dann Code haben, der das komplette Ereignis des Webdienstaufrufs behandelt.

Für die Arbeit mit Designern können Sie im ServiceLocator einen Code haben, der den Dienst nur dann aufruft, wenn die Anwendung zur Laufzeit läuft und nicht im Visual Studio Designer.

Ich bin mir natürlich nicht sicher, ob dies zu Ihrer Programmarchitektur passt, aber es kann funktionieren.

1voto

Emond Punkte 48911

Sie könnten einen Test hinzufügen, damit der Dienst nicht aufgerufen wird im Entwurfsmodus :

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X