Compartir a través de


DomainDataSource

WCF RIA Services proporciona el control DomainDataSource para simplificar la interacción entre la interfaz de usuario y los datos del usuario desde un contexto de dominio. Con el control DomainDataSource, se puede recuperar, dar forma a, y modificar los datos utilizando solamente sintaxis declarativa. Debe especificar el contexto de dominio que se va a utilizar con el control DomainDataSource y, a continuación, llamar a las operaciones que están disponibles a través de ese contexto de dominio.

Configurar la aplicación de Silverlight para DomainDataSource

Para utilizar el control DomainDataSource, debe agregar una referencia en el proyecto de Silverlight al ensamblado System.Windows.Controls.DomainServices. Esta referencia se agrega automáticamente cuando se arrastra el control DomainDataSource desde el cuadro de herramientas. Opcionalmente, para utilizar DataGrid con DomainDataSource, debe agregar también una referencia a System.Windows.Controls.Data. Esta referencia también se agrega automáticamente cuando se arrastra el control DataGrid desde el cuadro de herramientas.

El control host, como UserControl, debe contener la siguiente referencia de espacio de nombres:

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

Opcionalmente, para utilizar el control DataGrid con DomainDataSource, debe agregar también el siguiente espacio de nombres:

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

Para definir el contexto de dominio en código declarativo, debe incluir el espacio de nombres del proyecto de servidor. En el siguiente ejemplo, ExampleApplication.Web es el nombre del proyecto de servidor. Utilizará el nombre de su proyecto de servidor.

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

Recuperar y mostrar datos

Debe especificar un contexto de dominio para el control DomainDataSource y proporcionar el nombre del método que se va a utilizar para cargar los datos. A continuación, debe enlazar controles de presentación como el control DataGrid al control DomainDataSource. En el ejemplo siguiente se muestra un control DomainDataSource que recupera datos de un contexto de dominio denominado ProductDomainContext y los muestra en un control DataGrid. Debe existir un método de consulta denominado GetProducts() en el servicio de dominio para que funcione el ejemplo.

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

Agregar parámetros a la consulta

En algunos casos, un método de consulta requiere valores de parámetros. Normalmente, un método de consulta requiere un valor de parámetro para filtrar los datos devueltos. La clase DomainDataSource proporciona la colección QueryParameters que facilita la adición de parámetros. En el siguiente ejemplo se muestra cómo agregar valores de parámetro con un valor que se especifica en el texto declarativo.

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

También se puede agregar un parámetro que utiliza un valor del usuario para la consulta. Debe enlazar un objeto Parameter al control de entrada de usuario que contiene el valor que se va a usar en la consulta. En el ejemplo siguiente se muestra cómo especificar un valor de un control ComboBox como valor de parámetro.

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

Ordenar

El control DomainDataSource proporciona la colección SortDescriptors para facilitar la ordenación de los datos. En la colección SortDescriptors, agregue las instancias de SortDescriptor que describen los valores que se utilizarán para ordenar la colección. Puede agregar tantas instancias SortDescriptor como desee para proporcionar capas de ordenación. Puede especificar si los datos se ordenan de forma ascendente o descendente. En el ejemplo siguiente se muestra cómo agregar un descriptor de ordenación al control DomainDataSource. Los datos recuperados de la consulta se ordenan por valores en la propiedad 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>

Cuando implemente la paginación y la ordenación conjuntamente, incluya al menos un elemento SortDescriptor con su atributo PropertyPath asignado a una propiedad que contiene valores únicos, como una clave principal. O bien, agregue una cláusula OrderBy basada en una propiedad que contiene valores únicos a la consulta en el elemento DomainDataSource. Si ordena solo los datos en una propiedad que no contiene valores únicos, los valores devueltos podrían contener datos incoherentes o podrían faltar datos en todas las páginas.

Agrupar

El control DomainDataSource proporciona la colección GroupDescriptors para facilitar la agrupación de los datos por valores de propiedad. En la colección GroupDescriptors, agregue instancias de GroupDescriptor que definan el valor que se utilizará para la operación de agrupar. Puede agregar tantas instancias de GroupDescriptor como sea necesario.

RIA_GroupedData

En el ejemplo siguiente se muestra cómo agregar un valor para utilizarlo en la agrupación.

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

Filtrar

El control DomainDataSource proporciona la colección FilterDescriptors que permite filtrar los datos que devuelve la consulta. Al agregar filtros, puede especificar que solo se carguen las entidades que cumplan la condición del filtro desde el contexto de dominio. Puede definir la relación lógica entre distintos filtros estableciendo la propiedad FilterOperator en el objeto DomainDataSource. La propiedad FilterOperator admite cualquier valor en el enumerador FilterDescriptorLogicalOperator.

En una instancia de FilterDescriptor, debe establecer la propiedad Operator para especificar el tipo de comparación que se va a utilizar al filtrar. Los descriptores de filtro admiten las operaciones en el enumerador FilterOperator.

En el ejemplo siguiente se muestran dos descriptores de filtro conectados mediante una instrucción lógica AND. Un filtro depende de los datos proporcionados por el usuario y se especifica un filtro en la sintaxis declarativa.

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

Paginar

Cuando se muestra un gran número de entidades, es posible que desee proporcionar paginación en la interfaz de usuario. El control DomainDataSource permite especificar el número de entidades que se desea cargar y el número de entidades que se desea mostrar en una página. Los nuevos registros solo se cargan cuando el usuario navega hasta una página que contiene entidades que no se han cargado. Debe establecer las propiedades LoadSize y PageSize para especificar los parámetros para paginar. A continuación, debe enlazar una instancia de DataPager al control DomainDataSource para implementar la interfaz para paginar.

[!NOTA] Si utiliza DataPager en una aplicación con un almacén de datos de Entity Framework, debe ordenar los datos devueltos por las consultas para que DataPager funcione correctamente. Entity Framework no admite la paginación de datos sin una cláusula OrderBy en el método de consulta o la ordenación especificada en el cliente de Silverlight.

En el ejemplo siguiente se muestra una paginación con el control 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>

Editar

Para conservar las modificaciones de datos, llame al método SubmitChanges en el objeto DomainDataSource. Para cancelar los cambios, llame al método RejectChanges.