DomainDataSource

WCF RIA Services stellt das DomainDataSource-Steuerelement bereit, um die Interaktion zwischen der Benutzeroberfläche und den Daten aus einem Domänenkontext zu vereinfachen. Mit dem DomainDataSource-Steuerelement können Sie Daten abrufen, strukturieren und bearbeiten, indem Sie ausschließlich deklarative Syntax verwenden. Sie geben den Domänenkontext an, der mit dem DomainDataSource-Steuerelement verwendet werden soll, und rufen dann die Vorgänge auf, die in diesem Domänenkontext verfügbar sind.

Konfigurieren der Silverlight-Anwendung für DomainDataSource

Zur Verwendung des DomainDataSource-Steuerelements müssen Sie im Silverlight-Projekt einen Verweis auf die System.Windows.Controls.DomainServices-Assembly hinzufügen. Dieser Verweis wird automatisch hinzugefügt, wenn Sie das DomainDataSource-Steuerelement aus der Toolbox ziehen. Wenn Sie das DataGrid mit DomainDataSource verwenden möchten, müssen Sie außerdem einen Verweis auf System.Windows.Controls.Data hinzufügen. Dieser Verweis wird ebenfalls automatisch hinzugefügt, wenn Sie das DataGrid-Steuerelement aus der Toolbox ziehen.

Das Hoststeuerelement, z. B. das UserControl-Steuerelement, muss den folgenden Namespaceverweis enthalten:

xmlns:riaControls="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.DomainServices"

Wenn Sie das DataGrid-Steuerelement mit dem DomainDataSource-Steuerelement verwenden möchten, müssen Sie auch den folgenden Namespace hinzufügen:

xmlns:data="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Data"

Um den Domänenkontext in deklarativem Code zu definieren, müssen Sie den Namespace des Serverprojekts einschließen. Im folgenden Beispiel ist "ExampleApplication.Web" der Name des Serverprojekts. Sie verwenden den Namen des Serverprojekts.

xmlns:domain="clr-namespace:ExampleApplication.Web"

Abrufen und Anzeigen von Daten

Sie geben einen Domänenkontext für das DomainDataSource-Steuerelement und den Namen der Methode an, die zum Laden von Daten verwendet werden soll. Anschließend binden Sie Darstellungssteuerelemente wie DataGrid an das DomainDataSource-Steuerelement. Das folgende Beispiel zeigt ein DomainDataSource-Steuerelement, das Daten aus einem Domänenkontext mit dem Namen ProductDomainContext abruft und die Daten in einem DataGrid-Steuerelement anzeigt. Im Domänendienst muss eine Abfragemethode mit dem Namen GetProducts() vorhanden sein, damit das Beispiel funktioniert.

<UserControl x:Class="ExampleApplication.MainPage"
    xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="https://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="https://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:riaControls="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.DomainServices"
    xmlns:data="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Data"
    xmlns:domain="clr-namespace:ExampleApplication.Web"
    mc:Ignorable="d">

    <Grid x:Name="LayoutRoot" Background="White">
        <riaControls:DomainDataSource Name="source" AutoLoad="True" QueryName="GetProducts">
            <riaControls:DomainDataSource.DomainContext>
                <domain:ProductDomainContext />
            </riaControls:DomainDataSource.DomainContext>
        </riaControls:DomainDataSource>
        <data:DataGrid ItemsSource="{Binding Data, ElementName=source}"  />
    </Grid>
</UserControl>

Hinzufügen von Parametern zur Abfrage

In einigen Fällen erfordert eine Abfragemethode Parameterwerte. In der Regel ist ein Parameterwert für eine Abfragemethode erforderlich, um die zurückgegebenen Daten zu filtern. Die DomainDataSource-Klasse stellt die QueryParameters-Auflistung bereit, um das Hinzufügen von Parametern zu ermöglichen. Das folgende Beispiel zeigt, wie ein Parameter mit einem im deklarativen Text angegebenen Wert hinzugefügt wird.

<Grid x:Name="LayoutRoot" Background="White">
    <riaControls:DomainDataSource Name="source" QueryName="GetProductsByColor" AutoLoad="true">
        <riaControls:DomainDataSource.DomainContext>
            <domain:ProductDomainContext />
        </riaControls:DomainDataSource.DomainContext>
        <riaControls:DomainDataSource.QueryParameters>
            <riaControls:Parameter ParameterName="color" Value="Black" />
        </riaControls:DomainDataSource.QueryParameters>
    </riaControls:DomainDataSource>
    <data:DataGrid ItemsSource="{Binding Data, ElementName=source}" />
</Grid>

Sie können auch einen Parameter hinzufügen, für den ein vom Benutzer eingegebener Wert für die Abfrage verwendet wird. An das Benutzereingabe-Steuerelement, das den in der Abfrage zu verwendenden Wert enthält, wird ein Parameter-Objekt gebunden. Das folgende Beispiel zeigt, wie ein Wert aus einem Kombifeld als Parameterwert angegeben wird.

<Grid x:Name="LayoutRoot" Background="White">
    <Grid.RowDefinitions>
        <RowDefinition Height="25" />
        <RowDefinition Height="Auto" />
    </Grid.RowDefinitions>
    <riaControls:DomainDataSource Name="source" QueryName="GetProductsByColor" AutoLoad="true">
        <riaControls:DomainDataSource.DomainContext>
            <domain:ProductDomainContext />
        </riaControls:DomainDataSource.DomainContext>
        <riaControls:DomainDataSource.QueryParameters>
            <riaControls:Parameter ParameterName="color" Value="{Binding ElementName=colorCombo, Path=SelectedItem.Content}" />
        </riaControls:DomainDataSource.QueryParameters>
    </riaControls:DomainDataSource>
    <ComboBox Width="60"  Grid.Row="0" x:Name="colorCombo">
        <ComboBoxItem Content="Black" />
        <ComboBoxItem Content="Blue" />
    </ComboBox>
    <data:DataGrid Grid.Row="1" ItemsSource="{Binding Data, ElementName=source}" />
</Grid>

Sortieren

Das DomainDataSource-Steuerelement stellt die SortDescriptors-Auflistung bereit, um das Sortieren der Daten zu ermöglichen. Fügen Sie in der SortDescriptors-Auflistung SortDescriptor-Instanzen hinzu, die die Werte zum Sortieren der Auflistung beschreiben. Sie können so viele SortDescriptor-Instanzen hinzufügen, wie Sie Ebenen der Sortierung bereitstellen möchten. Sie können angeben, ob die Daten in aufsteigender oder absteigender Reihenfolge sortiert werden. Das folgende Beispiel zeigt, wie Sie einen Sortierdeskriptor für das DomainDataSource-Steuerelement hinzufügen. Die mit der Abfrage abgerufenen Daten werden nach Werten in der StandardPrice-Eigenschaft sortiert.

<Grid x:Name="LayoutRoot" Background="White">
    <riaControls:DomainDataSource Name="source" QueryName="GetProducts" AutoLoad="true">
        <riaControls:DomainDataSource.DomainContext>
            <domain:ProductDomainContext />
        </riaControls:DomainDataSource.DomainContext>
        <riaControls:DomainDataSource.SortDescriptors>
            <riaControls:SortDescriptor PropertyPath="StandardCost" Direction="Ascending" />
            <riaControls:SortDescriptor PropertyPath="ProductID" Direction="Ascending" />
        </riaControls:DomainDataSource.SortDescriptors>
    </riaControls:DomainDataSource>
    <data:DataGrid ItemsSource="{Binding Data, ElementName=source}" />
</Grid>

Schließen Sie mindestens einen SortDescriptor ein, dessen PropertyPath-Attribut einer Eigenschaft zugewiesen ist, die eindeutige Werte enthält (z. B. ein Primärschlüssel), wenn Sie Paging und Sortierung zusammen implementieren. Sie können der Abfrage in der DomainDataSource auch eine OrderBy-Klausel hinzufügen, die auf einer Eigenschaft mit eindeutigen Werten basiert. Wenn Sie die Daten nur mit einer Eigenschaft ohne eindeutige Werte sortieren, können die Rückgabewerte über mehrere Seiten hinweg inkonsistente und lückenhafte Daten enthalten.

Gruppierung

Das DomainDataSource-Steuerelement stellt die GroupDescriptors-Auflistung bereit, um die Gruppierung der Daten nach Eigenschaftswerten zu ermöglichen. Fügen Sie in der GroupDescriptors-Auflistung GroupDescriptor-Instanzen hinzu, die den Wert für die Gruppierung definieren. Sie können so viele GroupDescriptor-Instanzen wie nötig hinzufügen.

RIA_GroupedData

Das folgende Beispiel zeigt, wie ein Wert für die Gruppierung hinzugefügt wird.

<Grid x:Name="LayoutRoot" Background="White">
    <riaControls:DomainDataSource Name="source" QueryName="GetProducts" AutoLoad="true">
        <riaControls:DomainDataSource.DomainContext>
            <domain:ProductDomainContext />
        </riaControls:DomainDataSource.DomainContext>
        <riaControls:DomainDataSource.GroupDescriptors>
            <riaControls:GroupDescriptor PropertyPath="Size" />
        </riaControls:DomainDataSource.GroupDescriptors>
    </riaControls:DomainDataSource>
    <data:DataGrid ItemsSource="{Binding Data, ElementName=source}" />
</Grid>

Filtern

Das DomainDataSource-Steuerelement stellt die FilterDescriptors-Auflistung bereit, um das Filtern der von der Abfrage zurückgegebenen Daten zu ermöglichen. Durch Hinzufügen von Filtern können Sie festlegen, dass nur Entitäten, die die Bedingung des Filters erfüllen, aus dem Domänenkontext geladen werden. Sie definieren die logische Beziehung zwischen verschiedenen Filtern, indem Sie die FilterOperator-Eigenschaft für das DomainDataSource-Objekt festlegen. Die FilterOperator-Eigenschaft unterstützt jeden Wert im FilterDescriptorLogicalOperator-Enumerator.

Legen Sie in einer FilterDescriptor-Instanz die Operator-Eigenschaft fest, um den Vergleichstyp anzugeben, der bei der Filterung verwendet werden soll. Filterdeskriptoren unterstützen die Vorgänge im FilterOperator-Enumerator.

Das folgende Beispiel zeigt zwei Filterdeskriptoren, die über eine logische AND-Anweisung verknüpft sind. Der eine Filter hängt von der Benutzereingabe ab, und der andere Filter wird in der deklarativen Syntax angegeben.

<Grid x:Name="LayoutRoot" Background="White">
    <Grid.RowDefinitions>
        <RowDefinition Height="25" />
        <RowDefinition Height="Auto" />
    </Grid.RowDefinitions>
    <riaControls:DomainDataSource Name="source" FilterOperator="And" QueryName="GetProducts" AutoLoad="true">
        <riaControls:DomainDataSource.DomainContext>
            <domain:ProductDomainContext />
        </riaControls:DomainDataSource.DomainContext>
        <riaControls:DomainDataSource.FilterDescriptors>
            <riaControls:FilterDescriptor PropertyPath="Color" Operator="IsEqualTo" Value="Blue" />
            <riaControls:FilterDescriptor PropertyPath="ListPrice" Operator="IsLessThanOrEqualTo" Value="{Binding ElementName=MaxPrice, Path=SelectedItem.Content}" />
        </riaControls:DomainDataSource.FilterDescriptors>
    </riaControls:DomainDataSource>
    <ComboBox x:Name="MaxPrice" Grid.Row="0" Width="60" SelectedIndex="0">
        <ComboBoxItem Content="100" />
        <ComboBoxItem Content="500" />
        <ComboBoxItem Content="1000" />
    </ComboBox>
    <data:DataGrid Grid.Row="1" ItemsSource="{Binding Data, ElementName=source}" />
</Grid>

Paging

Wenn Sie viele Entitäten anzeigen, möchten Sie in der Benutzeroberfläche möglicherweise Paging bereitstellen. Das DomainDataSource-Steuerelement ermöglicht es Ihnen, die zu ladende Anzahl von Entitäten und die auf einer Seite anzuzeigende Anzahl von Entitäten anzugeben. Neue Datensätze werden nur geladen, wenn der Benutzer zu einer Seite navigiert, die nicht geladene Entitäten enthält. Zum Angeben der Parameter für das Paging legen Sie die PageSize- und LoadSize-Eigenschaften fest. Anschließend binden Sie eine DataPager-Instanz an das DomainDataSource-Steuerelement, um die Schnittstelle für das Paging zu implementieren.

noteHinweis:
Wenn Sie den DataPager in einer Anwendung mit einem Entity Framework-Datenspeicher verwenden, müssen Sie die von den Abfragen zurückgegebenen Daten sortieren, damit der DataPager korrekt funktioniert. Das Entity Framework unterstützt das Paging von Daten ohne OrderBy-Klausel in der Abfragemethode oder Sortieren auf dem Silverlight-Client nicht.

Das folgende Beispiel zeigt das Paging mit dem DomainDataSource-Steuerelement.

<Grid x:Name="LayoutRoot" Background="White">
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto" />
        <RowDefinition Height="Auto" />
    </Grid.RowDefinitions>
    <riaControls:DomainDataSource PageSize="15" LoadSize="30" Name="source" QueryName="GetProducts" AutoLoad="true">
        <riaControls:DomainDataSource.DomainContext>
            <domain:ProductDomainContext />
        </riaControls:DomainDataSource.DomainContext>
        <riaControls:DomainDataSource.SortDescriptors>
            <riaControls:SortDescriptor PropertyPath="ListPrice" />
        </riaControls:DomainDataSource.SortDescriptors>
    </riaControls:DomainDataSource>
    <data:DataGrid Grid.Row="0" ItemsSource="{Binding Data, ElementName=source}" />
    <data:DataPager Grid.Row="1" Source="{Binding Data, ElementName=source}" />
</Grid>

Bearbeiten

Um Datenänderungen beizubehalten, rufen Sie die SubmitChanges-Methode für das DomainDataSource-Objekt auf. Um Änderungen zu verwerfen, rufen Sie die RejectChanges-Methode auf.