Exemplarische Vorgehensweise: Binden von WPF-Steuerelementen an einen WCF-Datendienst

In dieser exemplarischen Vorgehensweise erstellen Sie eine WPF-Anwendung, die datengebundene Steuerelemente enthält. Die Steuerelemente werden an Kundendatensätze gebunden, die in einem WCF Data Service gekapselt sind. Sie fügen außerdem Schaltflächen hinzu, mit denen Kunden Datensätze anzeigen und aktualisieren können.

In dieser exemplarischen Vorgehensweise werden die folgenden Aufgaben veranschaulicht:

  • Erstellen eines Entity Data Model, das aus Daten in der Beispieldatenbank AdventureWorksLT generiert wird

  • Erstellen eines WCF Data Service, der die Daten im Entity Data Model für eine WPF-Anwendung verfügbar macht

  • Erstellen eines Satzes datengebundener Steuerelemente, indem Elemente aus dem Datenquellenfenster in den WPF-Designer gezogen werden

  • Erstellen von Schaltflächen für die Vorwärts- und Rückwärtsnavigation in Kundendatensätzen

  • Erstellen einer Schaltfläche, mit der Änderungen an Daten in den Steuerelementen im WCF Data Service und der zugrunde liegenden Datenquelle gespeichert werden

    Tipp

    Auf Ihrem Computer werden möglicherweise andere Namen oder Speicherorte für die Benutzeroberflächenelemente von Visual Studio angezeigt als die in den folgenden Anweisungen aufgeführten. Die von Ihnen verwendete Visual Studio-Edition und die Einstellungen legen diese Elemente fest. Weitere Informationen finden Sie unter Arbeiten mit Einstellungen.

Vorbereitungsmaßnahmen

Zum Durchführen dieser exemplarischen Vorgehensweise benötigen Sie die folgenden Komponenten:

  • Visual Studio 2010.

  • Zugriff auf eine gegenwärtig ausgeführte Instanz von SQL Server oder SQL Server Express, die mit der AdventureWorksLT-Beispieldatenbank verknüpft ist. Sie können die AdventureWorksLT-Datenbank von der CodePlex-Website herunterladen.

Vorkenntnisse in folgenden Konzepten sind außerdem hilfreich, wenn auch für die Durchführung der exemplarischen Vorgehensweise nicht erforderlich:

Erstellen des Dienstprojekts

Beginnen Sie diese exemplarische Vorgehensweise, indem Sie ein Projekt für einen WCF Data Service erstellen.

So erstellen Sie das Dienstprojekt

  1. Starten Sie Visual Studio.

  2. Zeigen Sie im Menü Datei auf Neu, und klicken Sie dann auf Projekt.

  3. Erweitern Sie Visual C# oder Visual Basic, und wählen Sie dann Web aus.

  4. Wählen Sie die Projektvorlage ASP.NET-Webanwendung aus.

  5. Geben Sie im Feld Name die Bezeichnung AdventureWorksService ein, und klicken Sie auf OK.

    Visual Studio erstellt das Projekt AdventureWorksService.

  6. Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf Default.aspx, und wählen Sie Löschen aus. Diese Datei wird in dieser exemplarischen Vorgehensweise nicht benötigt.

Erstellen eines Entity Data Model für den Dienst

Um Daten mit einem WCF Data Service für eine Anwendung verfügbar zu machen, müssen Sie ein Datenmodell für den Dienst definieren. Der WCF Data Service unterstützt zwei Typen von Datenmodellen: Entity Data Models und benutzerdefinierte Datenmodelle, die mit CLR (Common Language Runtime)-Objekten definiert werden, die die IQueryable<T>-Schnittstelle implementieren. In dieser exemplarischen Vorgehensweise erstellen Sie ein Entity Data Model für das Datenmodell.

So erstellen Sie ein Entity Data Model

  1. Klicken Sie im Menü Projekt auf Neues Element hinzufügen.

  2. Wählen Sie das Projektelement ADO.NET Entity Data Model aus.

  3. Ändern Sie den Namen in AdventureWorksModel.edmx, und klicken Sie auf Hinzufügen.

    Der Assistent für Entity Data Model wird geöffnet.

  4. Klicken Sie auf der Seite Modellinhalt auswählen auf Aus Datenbank generieren und auf Weiter.

  5. Wählen Sie auf der Seite Wählen Sie Ihre Datenverbindung aus eine der folgenden Optionen aus:

    • Wenn in der Dropdownliste eine Datenverbindung mit der AdventureWorksLT-Beispieldatenbank verfügbar ist, wählen Sie diese aus.

      – oder –

    • Klicken Sie auf Neue Verbindung, und erstellen Sie eine Verbindung mit der AdventureWorksLT-Datenbank.

  6. Stellen Sie sicher, dass auf der Seite Wählen Sie Ihre Datenverbindung aus die Option Speichern Sie die Entitätsverbindungseinstellungen in App.Config als aktiviert ist, und klicken Sie dann auf Weiter.

  7. Erweitern Sie auf der Seite Datenbankobjekte auswählen den Knoten Tabellen, und wählen Sie dann die Tabelle SalesOrderHeader aus.

  8. Klicken Sie auf Fertig stellen.

Erstellen des Diensts

Erstellen Sie einen WCF Data Service, um die Daten im Entity Data Model für eine WPF-Anwendung verfügbar zu machen.

So erstellen Sie den Dienst

  1. Klicken Sie im Menü Projekt auf Neues Element hinzufügen.

  2. Wählen Sie das Projektelement WCF-Datendienst aus.

  3. Geben Sie im Feld Name die Bezeichnung AdventureWorksService.svc ein, und klicken Sie auf Hinzufügen.

    Visual Studio fügt dem Projekt die Datei AdventureWorksService.svc hinzu.

Konfigurieren des Diensts

Sie müssen den Dienst für das Entity Data Model konfigurieren, das Sie erstellt haben.

So konfigurieren Sie den Dienst

  1. Ersetzen Sie in der Codedatei AdventureWorks.svc die AdventureWorksService-Klassendeklaration durch folgenden Code.

    Public Class AdventureWorksService
        Inherits DataService(Of AdventureWorksLTEntities)
    
        ' This method is called only once to initialize service-wide policies.
        Public Shared Sub InitializeService(ByVal config As IDataServiceConfiguration)
            config.SetEntitySetAccessRule("SalesOrderHeaders", EntitySetRights.All)
            config.UseVerboseErrors = True
        End Sub
    End Class
    
    public class AdventureWorksService : DataService<AdventureWorksLTEntities>
    {
        // This method is called only once to initialize service-wide policies.
        public static void InitializeService(IDataServiceConfiguration config)
        {
            config.SetEntitySetAccessRule("SalesOrderHeaders", EntitySetRights.All);
        }
    }
    

    Dieser Code aktualisiert die AdventureWorksService-Klasse, sodass sie von einem DataService<T> abgeleitet wird, der auf die AdventureWorksLTEntities-Objektkontextklasse im Entity Data Model angewendet wird. Außerdem wird die InitializeService-Methode aktualisiert, um für Clients des Diensts vollständigen Lese-/Schreibzugriff auf die SalesOrderHeader-Entität zuzulassen.

    Weitere Informationen über Objektkontextklassen in ADO.NET Entity Framework finden Sie unter Object Services Overview (Entity Framework).

  2. Erstellen Sie das Projekt, und überprüfen Sie, ob es ohne Fehler erstellt wurde.

Erstellen der WPF-Clientanwendung

Um die Daten aus dem WCF Data Service anzuzeigen, erstellen Sie eine neue WPF-Anwendung mit einer Datenquelle, die auf dem Dienst basiert. Später in dieser exemplarischen Vorgehensweise fügen Sie der Anwendung datengebundene Steuerelemente hinzu.

So erstellen Sie die WPF-Clientanwendung

  1. Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf den Projektmappenknoten, klicken Sie auf Hinzufügen, und wählen Sie Neues Projekt aus.

    Tipp

    In Visual Basic-Projekten wird der Projektmappenknoten nur im Projektmappen-Explorer angezeigt, wenn das Kontrollkästchen Projektmappe immer anzeigen in Allgemein, Projekte und Projektmappen, Dialogfeld "Optionen" aktiviert ist.

  2. Erweitern Sie im Dialogfeld Neues Projekt den Eintrag Visual C# oder Visual Basic, und wählen Sie dann Windows aus.

  3. Wählen Sie die Projektvorlage WPF-Anwendung aus.

  4. Geben Sie im Feld Name die Bezeichnung AdventureWorksSalesEditor ein, und klicken Sie auf OK.

    Visual Studio fügt der Projektmappe das Projekt AdventureWorksSalesEditor hinzu.

  5. Klicken Sie im Menü Daten auf Datenquellen anzeigen.

    Das Fenster Datenquellen wird geöffnet.

  6. Klicken Sie im Datenquellenfenster auf Neue Datenquelle hinzufügen.

    Der Assistent zum Konfigurieren von Datenquellen wird geöffnet.

  7. Wählen Sie auf der Seite Datenquellentyp auswählen des Assistenten Dienst aus, und klicken Sie dann auf Weiter.

  8. Klicken Sie im Dialogfeld Dienstverweis hinzufügen auf Ermitteln.

    Visual Studio sucht in der aktuellen Projektmappe nach verfügbaren Diensten und fügt der Liste der verfügbaren Dienste im Feld Dienste den Dienst AdventureWorksService.svc hinzu.

  9. Geben Sie im Feld Namespace den Dienst AdventureWorksService ein.

  10. Klicken Sie im Feld Dienste auf AdventureWorksService.svc und dann auf OK.

    Visual Studio lädt die Dienstinformationen herunter und kehrt dann zum Assistent zum Konfigurieren von Datenquellen zurück.

  11. Klicken Sie auf der Seite Dienstverweis hinzufügen auf Fertig stellen.

    Visual Studio fügt Knoten hinzu, die die vom Dienst an das Datenquellenfenster zurückgegebenen Daten darstellen.

Definieren der Benutzeroberfläche des Fensters

Fügen Sie dem Fenster mehrere Schaltflächen hinzu, indem Sie das XAML im WPF-Designer ändern. Später in dieser exemplarischen Vorgehensweise fügen Sie Code hinzu, der es Benutzern ermöglicht, mit diesen Schaltflächen Verkaufsdatensätze anzuzeigen und zu aktualisieren.

So erstellen Sie das Fensterlayout

  1. Doppelklicken Sie im Projektmappen-Explorer auf MainWindow.xaml.

    Das Fenster wird im WPF-Designer geöffnet.

  2. Fügen Sie in der XAML-Ansicht des Designers zwischen den <Grid>-Tags folgenden Code hinzu:

    <Grid.RowDefinitions>
        <RowDefinition Height="75" />
        <RowDefinition Height="525" />
    </Grid.RowDefinitions>
    <Button HorizontalAlignment="Left" Margin="22,20,0,24" Name="backButton" Width="75">&lt;</Button>
    <Button HorizontalAlignment="Left" Margin="116,20,0,24" Name="nextButton" Width="75">&gt;</Button>
    <Button HorizontalAlignment="Right" Margin="0,21,46,24" Name="saveButton" Width="110">Save changes</Button>
    
  3. Erstellen Sie das Projekt.

Erstellen der datengebundenen Steuerelemente

Erstellen Sie Steuerelemente, die Kundendatensätze anzeigen, indem Sie den Knoten SalesOrderHeaders aus dem Datenquellenfenster in den Designer ziehen.

So erstellen Sie die datengebundenen Steuerelemente

  1. Klicken Sie im Datenquellenfenster auf das Dropdownmenü für den Knoten SalesOrderHeaders, und wählen Sie Details aus.

  2. Erweitern Sie den Knoten SalesOrderHeaders.

  3. In diesem Beispiel werden einige Felder nicht angezeigt. Klicken Sie daher auf das Dropdownmenü neben den folgenden Knoten, und wählen Sie Keine aus:

    • CreditCardApprovalCode

    • ModifiedDate

    • OnlineOrderFlag

    • RevisionNumber

    • rowguid

    Diese Aktion verhindert, dass Visual Studio im nächsten Schritt datengebundene Steuerelemente für diese Knoten erstellt. Bei dieser exemplarischen Vorgehensweise wird davon ausgegangen, dass diese Daten dem Endbenutzer nicht angezeigt werden müssen.

  4. Ziehen Sie den Knoten SalesOrderHeaders aus dem Datenquellenfenster in die Rasterzeile unter der Zeile, die die Schaltflächen enthält.

    Visual Studio generiert XAML und Code, mit denen ein Satz von Steuerelementen erstellt wird, die an Daten in der Tabelle Product gebunden werden. Weitere Informationen zum generierten XAML und Code finden Sie unter Binden von WPF-Steuerelementen an Daten in Visual Studio.

  5. Klicken Sie im Designer auf das Textfeld neben der Bezeichnung Customer ID.

  6. Aktivieren Sie im Fenster Eigenschaften das Kontrollkästchen neben der IsReadOnly-Eigenschaft.

  7. Legen Sie die IsReadOnly-Eigenschaft für jedes der folgenden Textfelder fest:

    • Purchase Order Number

    • Sales Order ID

    • Sales Order Number

Laden der Daten aus dem Dienst

Laden Sie Verkaufsdaten mithilfe des Dienstproxyobjekts aus dem Dienst, und weisen Sie dann der Datenquelle für die CollectionViewSource im WPF-Fenster die zurückgegebenen Daten zu.

So laden Sie die Daten aus dem Dienst

  1. Doppelklicken Sie im Designer auf den Text MainWindow, um den Window_Loaded-Ereignishandler zu erstellen.

  2. Ersetzen Sie den Ereignishandler durch folgenden Code. Stellen Sie sicher, dass Sie die localhost-Adresse in diesem Code durch die localhost-Adresse auf dem Entwicklungscomputer ersetzen.

    Private DataServiceClient As AdventureWorksService.AdventureWorksLTEntities
    Private SalesQuery As System.Data.Services.Client.DataServiceQuery(Of AdventureWorksService.SalesOrderHeader)
    Private OrdersViewSource As CollectionViewSource
    
    Private Sub Window_Loaded(ByVal Sender As Object, ByVal e As RoutedEventArgs) Handles MyBase.Loaded
    
        ' TODO: Modify the port number in the following URI as required.
        DataServiceClient = New AdventureWorksService.AdventureWorksLTEntities( _
        New Uri("https://localhost:32415/AdventureWorksService.svc"))
        SalesQuery = DataServiceClient.SalesOrderHeaders
    
        OrdersViewSource = CType(Me.FindResource("SalesOrderHeadersViewSource"), CollectionViewSource)
        OrdersViewSource.Source = SalesQuery.Execute()
        OrdersViewSource.View.MoveCurrentToFirst()
    End Sub
    
    private AdventureWorksService.AdventureWorksLTEntities dataServiceClient;
    private System.Data.Services.Client.DataServiceQuery<AdventureWorksService.SalesOrderHeader> salesQuery;
    private CollectionViewSource ordersViewSource;
    
    private void Window_Loaded(object sender, RoutedEventArgs e)
    {
        // TODO: Modify the port number in the following URI as required.
        dataServiceClient = new AdventureWorksService.AdventureWorksLTEntities(
            new Uri("https://localhost:45899/AdventureWorksService.svc"));
        salesQuery = dataServiceClient.SalesOrderHeaders;
    
        ordersViewSource = ((CollectionViewSource)(this.FindResource("salesOrderHeadersViewSource")));
        ordersViewSource.Source = salesQuery.Execute();
        ordersViewSource.View.MoveCurrentToFirst();
    }
    

Fügen Sie Code hinzu, der es Benutzern ermöglicht, mit den Schaltflächen < und > in Verkaufsdatensätzen zu navigieren.

So ermöglichen Sie es Benutzern, in Verkaufsdatensätzen zu navigieren

  1. Doppelklicken Sie im Designer auf die Schaltfläche < auf der Fensteroberfläche.

    Visual Studio öffnet die Code-Behind-Datei und erstellt einen neuen backButton_Click-Ereignishandler für das Click-Ereignis.

  2. Ersetzen Sie den generierten backButton_Click-Ereignishandler durch den folgenden Code:

    If OrdersViewSource.View.CurrentPosition > 0 Then
        OrdersViewSource.View.MoveCurrentToPrevious()
    End If
    
    if (ordersViewSource.View.CurrentPosition > 0)
        ordersViewSource.View.MoveCurrentToPrevious();
    
  3. Kehren Sie zum Designer zurück, und doppelklicken Sie auf die Schaltfläche >.

    Visual Studio öffnet die Code-Behind-Datei und erstellt einen neuen nextButton_Click-Ereignishandler für das Click-Ereignis.

  4. Ersetzen Sie den generierten nextButton_Click-Ereignishandler durch den folgenden Code.

    If OrdersViewSource.View.CurrentPosition < CType(OrdersViewSource.View, CollectionView).Count - 1 Then
        OrdersViewSource.View.MoveCurrentToNext()
    End If
    
    if (ordersViewSource.View.CurrentPosition < ((CollectionView)ordersViewSource.View).Count - 1)
    {
        ordersViewSource.View.MoveCurrentToNext();
    }
    

Speichern von Änderungen an Verkaufsdatensätzen

Fügen Sie Code hinzu, der es Benutzern ermöglicht, Änderungen an Verkaufsdatensätzen anzuzeigen und mit der Schaltfläche Änderungen speichern zu speichern.

So fügen Sie die Fähigkeit hinzu, Änderungen an Verkaufsdatensätzen zu speichern

  1. Doppelklicken Sie im Designer auf die Schaltfläche Änderungen speichern.

    Visual Studio öffnet die Code-Behind-Datei und erstellt einen neuen saveButton_Click-Ereignishandler für das Click-Ereignis.

  2. Fügen Sie dem saveButton_Click-Ereignishandler den folgenden Code hinzu.

    Dim CurrentOrder As AdventureWorksService.SalesOrderHeader = CType(OrdersViewSource.View.CurrentItem, AdventureWorksService.SalesOrderHeader)
    
    DataServiceClient.UpdateObject(CurrentOrder)
    DataServiceClient.SaveChanges()
    
    AdventureWorksService.SalesOrderHeader currentOrder = (AdventureWorksService.SalesOrderHeader)ordersViewSource.View.CurrentItem;
    dataServiceClient.UpdateObject(currentOrder);
    dataServiceClient.SaveChanges();
    

Testen der Anwendung

Erstellen Sie die Anwendung, und führen Sie sie aus, um zu überprüfen, ob Sie Verkaufsdatensätze anzeigen und aktualisieren können.

So testen Sie die Anwendung

  1. Klicken Sie im Menü Erstellen auf Projektmappe erstellen. Überprüfen Sie, ob sich die Projektmappe fehlerfrei erstellen lässt.

  2. Drücken Sie STRG+F5.

    Visual Studio startet das Projekt AdventureWorksService, ohne es zu debuggen.

  3. Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf das Projekt AdventureWorksSalesEditor.

  4. Klicken Sie im Kontextmenü unter Debuggen auf Neue Instanz starten.

    Die Anwendung wird ausgeführt. Überprüfen Sie Folgendes:

    • In den Textfeldern werden andere Datenfelder als der erste Verkaufsdatensatz angezeigt, der über die Verkaufsauftrags-ID 71774 verfügt.

    • Sie können auf die Schaltfläche > oder < klicken, um in anderen Verkaufsdatensätzen zu navigieren.

  5. Geben Sie in einem der Verkaufsdatensätze im Feld Kommentar Text ein, und klicken Sie dann auf Änderungen speichern.

  6. Schließen Sie die Anwendung, und starten Sie dann die Anwendung in Visual Studio neu.

  7. Navigieren Sie zu dem Verkaufsdatensatz, den Sie geändert haben, und überprüfen Sie, ob die Änderung nach dem Schließen und erneuten Öffnen der Anwendung beibehalten wurde.

  8. Schließen Sie die Anwendung.

Nächste Schritte

Nach Abschluss der exemplarischen Vorgehensweise sind Sie in der Lage, die folgenden zugehörigen Aufgaben auszuführen:

Siehe auch

Aufgaben

Gewusst wie: Binden von WPF-Steuerelementen an Daten in Visual Studio

Exemplarische Vorgehensweise: Binden von WPF-Steuerelementen an ein Entity Data Model

Exemplarische Vorgehensweise: Binden von WPF-Steuerelementen an ein Dataset

Konzepte

Binden von WPF-Steuerelementen an Daten in Visual Studio

Übersicht über den WPF- und Silverlight-Designer

Übersicht über Datenbindung

Weitere Ressourcen

ADO.NET Data Services Framework Overview

Data Model

Entity Data Model

Introducing the Entity Framework