Condividi tramite


DomainDataSource

WCF RIA Services fornisce il controllo DomainDataSource per semplificare l'interazione tra l'interfaccia utente e i dati di un contesto del dominio. Con DomainDataSource è possibile recuperare, definire e modificare i dati solo mediante la sintassi dichiarativa. Specificare il contesto del dominio da utilizzare con DomainDataSource, quindi chiamare le operazioni disponibili tramite tale contesto del dominio.

Configurazione dell'applicazione Silverlight per DomainDataSource

Per utilizzare il controllo DomainDataSource, è necessario aggiungere un riferimento nel progetto Silverlight all'assembly System.Windows.Controls.DomainServices. Questo riferimento viene aggiunto automaticamente quando si trascina l'oggetto DomainDataSource dalla casella degli strumenti. Se si desidera utilizzare l'oggetto DataGrid con DomainDataSource, è inoltre necessario aggiungere un riferimento a System.Windows.Controls.Data. Anche questo riferimento viene aggiunto automaticamente quando si trascina il controllo DataGrid dalla casella degli strumenti.

Il controllo host, ad esempio UserControl, deve contenere il riferimento allo spazio dei nomi seguente:

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

Se si desidera utilizzare il controllo DataGrid con DomainDataSource, è inoltre necessario aggiungere lo spazio dei nomi seguente:

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

Per definire il contesto del dominio nel codice dichiarativo, è necessario includere lo spazio dei nomi del progetto server. Nell'esempio seguente ExampleApplication.Web è il nome del progetto server. Verrà utilizzato il nome del progetto server.

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

Recupero e visualizzazione dei dati

Specificare un contesto del dominio per DomainDataSource e fornire il nome del metodo da utilizzare per il caricamento dei dati. Associare quindi i controlli della presentazione come DataGrid all'oggetto DomainDataSource. Nell'esempio seguente viene illustrato un oggetto DomainDataSource che recupera i dati da un contesto del dominio denominato ProductDomainContext e li visualizza in un controllo DataGrid. Affinché l'esempio funzioni, è necessario che nel servizio del dominio esista un metodo di query denominato GetProducts().

<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>

Aggiunta di parametri alla query

In alcuni casi, un metodo di query richiede alcuni valori dei parametri. In genere, un metodo di query richiede un valore del parametro per filtrare i dati restituiti. La classe DomainDataSource fornisce la raccolta QueryParameters per semplificare l'aggiunta di parametri. Nell'esempio seguente viene illustrato come aggiungere un valore del parametro con un valore specificato nel testo dichiarativo.

<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>

È inoltre possibile aggiungere un parametro che utilizza un valore fornito dall'utente per la query. Associare un oggetto Parameter al controllo dell'input utente che contiene il valore da utilizzare nella query. Nell'esempio seguente viene illustrato come specificare un valore di un oggetto ComboBox come valore del parametro.

<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>

Ordinamento

DomainDataSource fornisce la raccolta SortDescriptors per semplificare l'ordinamento dei dati. Nella raccolta SortDescriptors aggiungere le istanze di SortDescriptor che descrivono i valori da utilizzare per ordinare la raccolta. È possibile aggiungere tutte le istanze di SortDescriptor desiderate per fornire livelli di ordinamento nonché specificare un ordinamento crescente o decrescente per i dati. Nell'esempio seguente viene illustrato come aggiungere un descrittore di ordinamento all'oggetto DomainDataSource. I dati recuperati dalla query vengono ordinati in base ai valori nella proprietà StandardPrice.

<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>

Quando si implementano operazioni di paging e ordinamento contemporaneamente, includere almeno un oggetto SortDescriptor con il relativo attributo PropertyPath assegnato a una proprietà che contenga valori univoci, ad esempio una chiave primaria, oppure aggiungere una clausola OrderBy basata su una proprietà che contenga valori univoci alla query in DomainDataSource. Se si ordinano i dati solo in base a una proprietà che non contiene valori univoci, i valori restituiti potrebbero contenere dati incoerenti o mancanti tra le pagine.

Raggruppamento

DomainDataSource fornisce la raccolta GroupDescriptors per semplificare il raggruppamento dei dati in base ai valori delle proprietà. Nella raccolta GroupDescriptors aggiungere le istanze di GroupDescriptor che definiscono il valore da utilizzare per il raggruppamento. È possibile aggiungere tutte le istanze di GroupDescriptor necessarie.

RIA_GroupedData

Nell'esempio seguente viene illustrato come aggiungere un valore da utilizzare per il raggruppamento.

<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>

Applicazione di filtri

Il controllo DomainDataSource fornisce la raccolta FilterDescriptors per consentire di filtrare i dati restituiti dalla query. Aggiungendo filtri, è possibile specificare che solo entità che soddisfano la condizione nel filtro vengano caricate dal contesto del dominio. Per definire la relazione logica tra filtri diversi, impostare la proprietà FilterOperator sull'oggetto DomainDataSource. La proprietà FilterOperator supporta qualsiasi valore nell'enumeratore FilterDescriptorLogicalOperator.

In un'istanza di FilterDescriptor impostare la proprietà Operator per specificare il tipo di confronto da utilizzare durante l'applicazione del filtro. I descrittori di filtro supportano le operazioni dell'enumeratore FilterOperator.

Nell'esempio seguente vengono illustrati due descrittori di filtro connessi da un'istruzione AND logica. Un filtro dipende dall'input dell'utente, mentre l'altro viene specificato nella sintassi dichiarativa.

<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

Quando si visualizza un numero elevato di entità, è possibile che si desideri consentire il paging nell'interfaccia utente. Il controllo DomainDataSource consente di specificare il numero di entità da caricare e il numero di entità da visualizzare in una pagina. I nuovi record vengono caricati solo quando l'utente passa a una pagina che contiene le entità che non sono state caricate. Impostare le proprietà PageSize e LoadSize per specificare i parametri per il paging. Associare quindi un'istanza di DataPager all'oggetto DomainDataSource per implementare l'interfaccia per il paging.

[!NOTA] Se si utilizza l'oggetto DataPager in un'applicazione con l'archivio dati di Entity Framework, è necessario ordinare i dati restituiti dalle query affinché l'oggetto DataPager funzioni correttamente. Entity Framework non supporta il paging dei dati senza una clausola OrderBy nel metodo di query né l'ordinamento specificato nel client Silverlight.

Nell'esempio seguente viene illustrato il paging con l'oggetto DomainDataSource.

<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>

Modifica

Per rendere persistenti le modifiche dei dati, chiamare il metodo SubmitChanges sull'oggetto DomainDataSource. Per annullare le modifiche, chiamare il metodo RejectChanges.