DomainDataSource
Les Services RIA WCF fournissent le contrôle DomainDataSource pour simplifier l'interaction entre l'interface utilisateur et les données d'un contexte de domaine. Grâce au DomainDataSource, vous pouvez récupérer, mettre en forme et modifier des données uniquement à l'aide de la syntaxe déclarative. Vous spécifiez le contexte de domaine à utiliser avec le DomainDataSource, puis appelez les opérations disponibles via ce contexte de domaine.
Configuration de l'application Silverlight pour le DomainDataSource
Pour utiliser le contrôle DomainDataSource, vous devez ajouter une référence dans le projet Silverlight à l'assembly System.Windows.Controls.DomainServices. Cette référence est ajoutée automatiquement lorsque vous faites glisser le DomainDataSource depuis la Boîte à outils. Facultativement, pour utiliser le DataGrid avec DomainDataSource, vous devez également ajouter une référence à System.Windows.Controls.Data. Cette référence est également ajoutée automatiquement lorsque vous faites glisser le contrôle DataGrid depuis la Boîte à outils.
Le contrôle hôte, tel que UserControl, doit contenir la référence d'espace de noms suivante :
xmlns:riaControls="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.DomainServices"
Facultativement, pour utiliser le contrôle DataGrid avec le DomainDataSource, vous devez aussi ajouter l'espace de noms suivant :
xmlns:data="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Data"
Pour définir le contexte de domaine dans le code déclaratif, vous devez inclure l'espace de noms du projet serveur. Dans l'exemple suivant, ExampleApplication.Web est le nom du projet serveur. Vous utiliserez le nom de votre projet serveur.
xmlns:domain="clr-namespace:ExampleApplication.Web"
Récupération et affichage de données
Vous spécifiez un contexte de domaine pour le DomainDataSource et fournissez le nom de la méthode à utiliser pour le chargement de données. Vous liez ensuite des contrôles de présentation comme le DataGrid au DomainDataSource. L'exemple suivant présente un DomainDataSource qui récupère des données d'un contexte de domaine nommé ProductDomainContext
et affiche ces données dans un contrôle DataGrid. Il doit exister une méthode de requête appelée GetProducts()
sur le service de domaine pour que l'exemple fonctionne.
<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>
Ajout de paramètres à la requête.
Dans certains cas, une méthode de requête requiert des valeurs de paramètre. En général, une méthode de requête requiert une valeur de paramètre pour filtrer les données retournées. La classe DomainDataSource fournit la collection QueryParameters pour faciliter l'ajout de paramètres. L'exemple suivant indique comment ajouter une valeur de paramètre avec une valeur spécifiée dans le texte déclaratif.
<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>
Vous pouvez aussi ajouter un paramètre qui utilise une valeur fournie par l'utilisateur pour la requête. Vous liez un objet Parameter au contrôle d'entrée utilisateur qui contient la valeur à utiliser dans la requête. L'exemple suivant montre comment spécifier qu'une valeur d'une zone de liste déroulante est utilisée comme valeur de paramètre.
<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>
Tri
Le DomainDataSource fournit la collection SortDescriptors pour faciliter le tri des données. Dans la collection SortDescriptors, vous ajoutez des instances de SortDescriptor qui décrivent les valeurs à utiliser pour le tri de la collection. Vous pouvez ajouter autant d'instances de SortDescriptor que vous le souhaitez pour fournir des couches de tri. Vous pouvez spécifier si les données sont triées en ordre croissant ou décroissant. L'exemple suivant montre comment ajouter un descripteur de tri au DomainDataSource. Les données récupérées à partir de la requête sont triées par valeurs dans la propriété 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>
Lorsque vous implémentez ensemble la pagination et le tri, incluez au moins un SortDescriptor avec son attribut PropertyPath assigné à une propriété qui contient des valeurs uniques, telles qu'une clé primaire. Ou ajoutez à la requête une clause OrderBy basée sur une propriété qui contient des valeurs uniques dans DomainDataSource. Si vous triez seulement les données sur une propriété qui ne contient pas de valeurs uniques, les valeurs de retour pourraient contenir des données incohérentes ou manquantes à travers des pages.
Regroupement
Le DomainDataSource fournit la collection GroupDescriptors pour faciliter le regroupement de données par valeurs de propriétés. Dans la collection GroupDescriptors, vous ajoutez des instances de GroupDescriptor qui définissent la valeur à utiliser pour le regroupement. Vous pouvez ajouter autant d'instances de GroupDescriptor que nécessaire.
L'exemple suivant montre comment ajouter une valeur à utiliser pour le regroupement.
<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>
Filtrage
Le contrôle DomainDataSource fournit la collection FilterDescriptors pour vous permettre de filtrer les données qui sont retournées par la requête. En ajoutant des filtres, vous pouvez spécifier que seules les entités qui remplissent la condition spécifiée dans le filtre sont chargées à partir du contexte de domaine. Vous définissez la relation logique entre différents filtres en définissant la propriété FilterOperator sur l'objet DomainDataSource. La propriété FilterOperator prend en charge toute valeur présente dans l'énumérateur FilterDescriptorLogicalOperator.
Dans une instance de FilterDescriptor, vous définissez la propriété Operator pour spécifier le type de comparaison à utiliser lors du filtrage. Les descripteurs de filtre prennent en charge les opérations dans l'énumérateur FilterOperator.
L'exemple suivant montre deux descripteurs de filtre connectés par une instruction logique AND. Un filtre dépend de l'entrée utilisateur et un filtre est spécifié dans la syntaxe déclarative.
<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>
Pagination
Lorsque vous affichez un grand nombre d'entités, il est préférable de fournir la pagination dans votre interface utilisateur. Le contrôle DomainDataSource vous permet de spécifier le nombre d'entités à charger et le nombre d'entités à afficher dans une page. Les nouveaux enregistrements sont chargés uniquement lorsque l'utilisateur accède à une page contenant des entités qui n'ont pas été chargées. Vous définissez les propriétés PageSize et LoadSize pour spécifier les paramètres de pagination. Vous liez ensuite une instance DataPager au DomainDataSource pour implémenter l'interface pour la pagination.
Remarque : |
---|
Si vous utilisez le DataPager dans une application avec un magasin de données Entity Framework, vous devez classer les données retournées par vos requêtes pour que le DataPager fonctionne correctement. L'Entity Framework ne prend pas en charge la pagination des données sans qu'une clause OrderBy soit présente dans la méthode de requête ou sans qu'un tri soit spécifié sur le client Silverlight. |
L'exemple suivant montre la pagination avec le 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>
Modification
Pour rendre des modifications de données persistantes, appelez la méthode SubmitChanges sur l'objet DomainDataSource. Pour annuler des modifications, appelez la méthode RejectChanges.