Utiliser plusieurs listes SharePoint dans une application Windows Phone
Créer des applications Windows Phone qui utilisent les données de plusieurs listes SharePoint.
Vous pouvez utiliser plusieurs listes SharePoint dans votre application de plusieurs façons. Lorsque vous créez une application Windows Phone basée sur le modèle d'Application de liste SharePoint Windows Phone, vous spécifiez une cible unique liste SharePoint, mais l'architecture du projet qui en résulte est suffisamment extensible pour prendre en charge l'intégration de plusieurs listes.
Importante
Si vous développez une application pour Windows Phone 8, vous devez utiliser Visual Studio Express 2012 au lieu de Visual Studio 2010 Express. À l’exception de l’environnement de développement, toutes les informations contenues dans cet article s’appliquent à la création d’applications pour Windows Phone 8 et Windows Phone 7. > Pour plus d’informations, voir Guide pratique pour configurer un environnement pour le développement d’applications mobiles pour SharePoint.
Créer une solution impliquant basés sur le même schéma des listes SharePoint
Si vous avez deux listes SharePoint basés sur le même schéma, vous pouvez tirer parti des classes implémentées par le modèle d'Application de liste SharePoint Windows Phone et créer des objets de ces classes spécifiques à chaque liste.
Supposons que vous disposez de deux listes SharePoint basés sur le modèle de liste de Contacts. Une liste, nommée, par exemple, l'équipe Marketing, contient des membres d'une équipe marketing dans votre organisation, et l'autre liste, équipe d'ingénierie, contienne des membres d'une équipe d'ingénierie. Si vous créez un projet à l’aide du modèle Application de liste SharePoint Windows Phone et que vous spécifiez la liste Équipe marketing comme liste cible sur laquelle baser le projet, une instance de la classe ListDataProvider est créée (nommée DataProvider par défaut) dans l’implémentation de la classe App dans le fichier App.xaml.cs du projet. Cet objet représente la liste (autrement dit, l'équipe Marketing) comme source de données pour l'application, qui fournissent des opérations pour accéder et manipuler des éléments dans la liste. Une instance de la classe ListViewModel est également créée pour la liste sur laquelle repose l'application. Cet objet possède un membre de propriété (qui se trouve également être nommé DataProvider) qui peut être défini sur une instance donnée de la classe ListDataProvider, établissement de la source de données pour l'instance de la classe ListViewModel.
Vous pouvez créer une instance supplémentaire de la classe ListDataProvider dans le projet pour servir de source de données pour la deuxième liste (équipe d’ingénierie) dans le fichier App.xaml.cs . L'objet est appelé SecondaryDataProvider dans le code suivant.
private static ListDataProvider m_SecondaryDataProvider;
public static ListDataProvider SecondaryDataProvider
{
get
{
if (m_SecondaryDataProvider != null)
return m_SecondaryDataProvider;
m_SecondaryDataProvider = new ListDataProvider();
m_SecondaryDataProvider.ListTitle = "Engineering Team";
m_SecondaryDataProvider.SiteUrl = new Uri("http://contoso:2012/sites/samplesite/");
return m_SecondaryDataProvider;
}
}
Ensuite, vous pouvez instancier un autre objet de la classe ListViewModel (nommé, par exemple, SecondaryViewModel) et affecter l'objet SecondaryDataProvider à sa propriété DataProvider, comme illustré dans le code suivant.
private static ListViewModel m_SecondaryViewModel;
public static ListViewModel SecondaryViewModel
{
get
{
if (m_SecondaryViewModel == null)
m_SecondaryViewModel = new ListViewModel { DataProvider = App.SecondaryDataProvider };
return m_SecondaryViewModel;
}
set
{
m_SecondaryViewModel = value;
}
}
Si les mêmes champs et vues pour les deux listes conviennent à vos besoins (et, encore une fois, si les deux listes ont les mêmes colonnes et champs), vous n’avez pas besoin d’apporter de modifications dans l’implémentation de la classe ListDataProvider (dans le fichier ListDataProvider.cs ).
Toutefois, pour afficher ou modifier les données à partir de la deuxième liste dans votre projet, vous devez ajouter des formulaires d'affichage à votre projet qui sont liés aux et configurées pour cette SecondaryViewModel. Par exemple, vous pouvez ajouter un dossier à votre projet nommé « SecondaryViews » et ajouter un fichier SecondaryList.xaml à ce dossier avec un balisage similaire à celui du fichier List.xaml par défaut généré par le modèle pour la liste principale du projet. Notez que vous devez distinguer votre formulaire List secondaire du formulaire List principal dans l’application en spécifiant une valeur distinctive pour l’attribut x:Class
de l’élément PhoneApplicationPage
dans le fichier SecondaryList.xaml .
<phone:PhoneApplicationPage
x:Class="MultipleSPListApp.SecondaryViews.ListForm"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone"
xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d" d:DesignWidth="480" d:DesignHeight="696"
FontFamily="{StaticResource PhoneFontFamilyNormal}"
FontSize="{StaticResource PhoneFontSizeNormal}"
Foreground="{StaticResource PhoneForegroundBrush}"
SupportedOrientations="PortraitOrLandscape" Orientation="Portrait"
shell:SystemTray.IsVisible="True" x:Name = "ListViewPage">
...
</phone:PhoneApplicationPage>
Dans le fichier code-behind associé, SecondaryList.xaml.cs, remplacez toutes les références à App.MainViewModel
par des références à App.SecondaryViewModel
. Par exemple, le constructeur dans le fichier doit être comme suit.
public ListForm()
{
InitializeComponent();
this.DataContext = App.SecondaryViewModel;
}
Remplacez également toutes les références dans le fichier code-behind par App.DataProvider
des références à et mettez à App.SecondaryDataProvider
jour tous les chemins de navigation pour pointer vers les pages XAML secondaires appropriées. Si vous ajoutez également un formulaire New secondaire à votre projet (nommé, par exemple, SecondaryNewForm.xaml dans le dossier SecondaryViews de votre projet), le gestionnaire dans le fichier SecondaryList.xaml.cs de l’événement OnNewButtonClick ressemble au code suivant.
private void OnNewButtonClick(object sender, EventArgs e)
{
// Instantiate a new instance of NewItemViewModel and go to NewForm.
App.SecondaryViewModel.CreateItemViewModelInstance = new NewItemViewModel { DataProvider = App.SecondaryDataProvider };
NavigationService.Navigate(new Uri("/SecondaryViews/SecondaryNewForm.xaml", UriKind.Relative));
}
Enfin, vous pouvez ajouter un bouton à l’ApplicationBar dans le fichier List.xaml pour afficher la page SecondaryList.xaml .
<phone:PhoneApplicationPage.ApplicationBar>
<shell:ApplicationBar IsVisible="True" IsMenuEnabled="True">
<shell:ApplicationBarIconButton x:Name="btnNew" IconUri="/Images/appbar.new.rest.png" Text="New" Click="OnNewButtonClick"/>
<shell:ApplicationBarIconButton x:Name="btnRefresh" IconUri="/Images/appbar.refresh.rest.png" Text="Refresh" IsEnabled="True" Click="OnRefreshButtonClick"/>
<!--Add the following button to navigate to the secondary list (Engineering Team).-->
<shell:ApplicationBarIconButton x:Name="btnSecondaryList" IconUri="/Images/appbar.upload.rest.png" Text="Engineering" IsEnabled="True" Click="OnSecondaryListButtonClick"/>
</shell:ApplicationBar>
</phone:PhoneApplicationPage.ApplicationBar>
Dans le fichier code-behind associé, List.xaml.cs, ajoutez un gestionnaire pour l'événement OnSecondaryListButtonClick déclarée dans le fichier List.xaml.
private void OnSecondaryListButtonClick(object sender, EventArgs e)
{
NavigationService.Navigate(new Uri("/SecondaryViews/SecondaryList.xaml", UriKind.Relative));
}
Les utilisateurs de votre application peuvent ensuite naviguer entre les listes de l'équipe Marketing et l'équipe d'ingénierie. Étant donné que les schémas de liste sous-jacents sont identiques, les objets DataProvider et MainViewModel par défaut générés par le modèle et les objets SecondaryDataProvider et SecondaryViewModel ajoutés gèrent toutes les transactions de données sans nécessiter de modification du fichier ListDataProvider.cs .
Créer une solution impliquant des listes SharePoint en fonction de différents schémas
L'approche de ce qui précède la section works que possible est redirigé (c'est-à-dire, pour les listes SharePoint repose sur le même schéma), mais la classe ListDataProvider dans l'Application Windows Phone SharePoint liste modèle est disponible pour les développeurs pour la personnalisation pour gérer plusieurs listes SharePoint qui ne peuvent pas être basés sur le même schéma ou ne peuvent pas inclure les mêmes colonnes et les champs.
Supposons, comme indiqué dans la section précédente, que vous disposez d'une liste SharePoint, équipe Marketing (basé sur le modèle de liste de Contacts), qui contient les membres d'une équipe commerciale. Supposons également que vous disposez d'une deuxième liste, nommée Orders (basés sur le modèle de liste personnalisé), contenant les colonnes et les types de champs affichés dans le tableau 1.
Tableau 1. Colonnes et champs pour la liste Commandes
Column | Type de champ | Obligatoire |
---|---|---|
Produit (c'est-à-dire, titre) | Ligne unique de texte (texte) | Oui |
Prix unitaire | Monétaire | Oui |
Quantité | Nombre | Aucun (valeur par défaut est zéro) |
Valeur de l'ordre | Calculé (prix unitaire * quantité) | Non |
Date de la commande | Date et heure (Datetime) | Non |
Statut de la commande | Choix | Non |
Client | Ligne unique de texte (texte) | Non |
Comme dans l'exemple de la section précédente, vous pouvez instancier un objet distinct ListDataProvider et un autre objet ListViewModel pour gérer la liste des commandes. Supposons que l'objet instancié ListDataProvider est nommé OrdersListDataProvider, comme illustré dans le code suivant.
private static ListDataProvider m_OrdersListDataProvider;
public static ListDataProvider OrdersListDataProvider
{
get
{
if (m_OrdersListDataProvider != null)
return m_OrdersListDataProvider;
m_OrdersListDataProvider = new ListDataProvider();
m_OrdersListDataProvider.ListTitle = "Orders";
m_OrdersListDataProvider.SiteUrl = new Uri("http://contoso:2012/sites/samplesite/"); // Specify a URL here for your server.
return m_OrdersListDataProvider;
}
}
Et supposons que l'objet instancié ListViewModel pour la liste de commandes est nommé OrdersListViewModel, comme illustré dans le code suivant.
private static ListViewModel m_OrdersListViewModel;
public static ListViewModel OrdersListViewModel
{
get
{
if (m_OrdersListViewModel == null)
m_OrdersListViewModel = new ListViewModel { DataProvider = App.OrdersListDataProvider };
return m_OrdersListViewModel;
}
set
{
m_OrdersListViewModel = value;
}
}
Le schéma de la liste des commandes diffère de celui de la liste de l'équipe Marketing. Vous pouvez prendre en charge les différences en ajoutant du code au fichier ListDataProvider.cs , en particulier à la classe CamlQueryBuilder .
public static class CamlQueryBuilder
{
static Dictionary<string, string> ViewXmls = new Dictionary<string, string>()
{
{"View1", @"<View><Query><OrderBy><FieldRef Name='Title' />
<FieldRef Name='FirstName' /></OrderBy></Query><RowLimit>30</RowLimit><ViewFields>{0}</ViewFields></View>"},
{"View2", @"<View><Query><OrderBy><FieldRef Name='ID' /></OrderBy></Query><RowLimit>30</RowLimit>
<ViewFields>{0}</ViewFields></View>"}
};
static string View1Fields = @"<FieldRef Name='Title'/><FieldRef Name='FirstName'/>
<FieldRef Name='JobTitle'/><FieldRef Name='Email'/><FieldRef Name='Comments'/>";
static string View2Fields = @"<FieldRef Name='Title'/><FieldRef Name='Unit_x0020_Price'/><FieldRef Name='Quantity'/>
<FieldRef Name='Order_x0020_Value'/><FieldRef Name='Order_x0020_Date'/>
<FieldRef Name='Status'/><FieldRef Name='Customer'/>";
public static CamlQuery GetCamlQuery(string viewName)
{
string viewXml = ViewXmls[viewName];
// Add ViewFields to the ViewXml depending on the view.
switch (viewName)
{
case "View2":
viewXml = string.Format(viewXml, View2Fields);
break;
case "View1":
default:
viewXml = string.Format(viewXml, View1Fields);
break;
}
return new CamlQuery { ViewXml = viewXml };
}
}
Ici, une deuxième entrée avec la valeur de clé « View2 » est ajoutée à l’objet ViewXmlsDictionary pour la liste Orders. (N’oubliez pas que les valeurs clés des entrées ajoutées au dictionnaireViewXmls dans la classe CamlQueryBuilder doivent être uniques (dans la solution) pour que la logique de mise en cache dans le modèle fonctionne correctement.) Les variables de chaîne ( View1Fields et View2Fields) sont utilisées pour stocker la liste des champs pour chaque vue. Ensuite, selon la valeur du paramètre viewName transmis à la méthode GetCamlQuery, la chaîne XML de requête CAML appropriée est créée.
Ensuite, comme indiqué dans la section précédente, vous pouvez créer des formulaires d'affichage pour la liste, lié cette fois aux objets OrdersListViewModel et OrdersListDataProvider. Par exemple, le code XAML d'un formulaire de liste spécifique à la liste des commandes, nommé OrdersList.xaml, serait similaire à la balise dans le fichier List.xaml généré par le modèle pour la liste principale dans l'application, sauf que vous nommez le contrôle PivotItem qui affiche la liste des « View2 » (au lieu de la valeur par défaut, « Affichage1 ») et la valeur de la déclaration de Binding pour l'attribut ItemsSource du contrôle ListBox dans lequel les éléments de liste sont restitués à « View2 » comme indiqué ci-dessous balisage (qui affiche uniquement le balisage de la grille de la racine de la page).
<Grid x:Name="LayoutRoot" Background="Transparent" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:controls="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone.Controls">
<!--Pivot Control-->
<ProgressBar x:Name="progressBar" Opacity="1" HorizontalAlignment="Center" VerticalAlignment="Top"
Height="30" Width="470" IsIndeterminate="{Binding IsBusy}" Visibility="{Binding ShowIfBusy}" />
<Grid x:Name="ContentPanel" Grid.Row="0" Width="470">
<controls:Pivot Name="Views" Title="Orders" LoadedPivotItem="OnPivotItemLoaded">
<!--Pivot item-->
<controls:PivotItem Name="View2" Header="All Orders">
<!--Double line list with text wrapping-->
<ListBox x:Name="lstBox1" Margin="0,0,-12,0" SelectionChanged="OnSelectionChanged" ItemsSource="{Binding [View2]}">
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Vertical" Margin="10">
<TextBlock Name="txtTitle" Text="{Binding [Title]}" TextWrapping="NoWrap"
Style="{StaticResource PhoneTextTitle2Style}" />
<TextBlock Name="txtUnitPrice" Text="{Binding [Unit_x0020_Price]}"
TextWrapping="NoWrap" Style="{StaticResource PhoneTextNormalStyle}" />
<TextBlock Name="txtQuantity" Text="{Binding [Quantity]}"
TextWrapping="NoWrap" Style="{StaticResource PhoneTextNormalStyle}" />
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
</controls:PivotItem>
</controls:Pivot>
</Grid>
</Grid>
Un moyen pratique de créer des balises XAML appropriée consiste à utiliser le modèle d'Application de liste SharePoint Windows Phone pour générer un projet séparé, basé sur la liste des commandes et puis copiez le code XAML généré à partir de ce projet dans le projet avec plusieurs listes, en veillant à modifier le nom du contrôle PivotItem (qui par défaut est « Affichage1 ») pour « View2 » et modifiez la déclaration de Binding du contrôle ListBox comme indiqué ici. Vous devez également modifier toutes les références dans le fichier code-behind associé pour le formulaire spécifier les objets ListViewModel et DataProvider appropriés (comme, par exemple, OrdersListViewModel et OrdersListDataProvider).
Cette approche fonctionne, car dans le fichier code-behind associé (nommé, dans ce cas, OrdersList.xaml.cs), les différents gestionnaires d'événements qui appellent les méthodes de l'objet ListDataProvider (ici, OrdersListDataProvider) pour accéder aux données de liste utilisez le nom de l' PivotItem contrôlent comme un moyen pour spécifier l'affichage approprié à utiliser. Par exemple, le Gestionnaire d'événements OnPivotItemLoaded appelle la méthode LoadData de l'objet OrdersListViewModel instancié à partir de la classe ListViewModel (et à son tour, cette méthode appelle la méthode LoadData de l'objet OrdersListDataProvider ), en passant le nom du contrôle PivotItem (ici, « View2 ») en tant que la valeur du paramètre ViewName à la méthode. Cette même valeur est finalement transmise (comme la valeur du paramètre viewName ) à la méthode GetCamlQuery présentée ci-dessus dans l'implémentation de modification de la classe CamlQueryBuilder.
Une autre approche pour une solution impliquant des listes SharePoint en fonction de différents schémas
Comme alternative à l'approche de la section précédente, vous pouvez utiliser le modèle d'Application de liste SharePoint Windows Phone pour créer un Windows Phone projet d'application dans une solution Microsoft Visual Studio 2010 basé sur une liste SharePoint donnée, puis ajoutez projets basée sur les autres listes à cette solution. Cette approche vous permet de tirer parti du modèle pour la génération des formulaires spécifiques à chaque liste SharePoint. Vous pouvez ensuite personnaliser la solution en fonction de vos besoins pour contrôler la façon dont les utilisateurs interagissent avec les listes. Les procédures décrites dans cette section montrent cette approche.
Pour les procédures suivantes, supposons que vous disposez d'une liste SharePoint nommée Orders (basés sur le modèle de liste personnalisé), avec les colonnes et les types de champs, comme indiqué dans le tableau 1 de la section précédente. En outre, supposons que vous disposez d'une autre liste SharePoint (là encore, basé sur le modèle de liste personnalisé), nommé Customers, avec les colonnes et les types de champs affichés dans le tableau 2.
Tableau 2. Colonnes et champs pour la liste clients
Column | Type de champ | Obligatoire |
---|---|---|
Nom du client (c'est-à-dire, titre) | Ligne unique de texte (texte) | Oui |
Numéro de contact | Ligne unique de texte (texte) | Non |
Adresse de messagerie | Ligne unique de texte (texte) | Non |
Société | Ligne unique de texte (texte) | Non |
Dans les procédures suivantes, vous créez une application Windows Phone qui utilise ces deux listes. La liste principale dans l'application est la liste des clients. Lorsque vous affichez les détails pour un client donné dans le formulaire d'affichage, un bouton est inclus sur le formulaire qui permet aux utilisateurs d'afficher toutes les commandes (à partir de la liste des commandes) associés à ce client.
Pour créer les projets de composant pour la solution
Create a Windows Phone app by using the Windows Phone SharePoint List Application template, specifying a SharePoint list defined based on the columns and field types shown in Table 2. In the procedures in this section, it is assumed that the name of the list in the project is "Customers" and the name of the project is "CustomersSPListApp". (Voir How to : Create a Windows Phone SharePoint list app for information about creating an app based the Windows Phone SharePoint List Application template.)
Dans Visual Studio, choisissez fichier, Ajouter, Nouveau projet.
La boîte de dialogue Ajouter un nouveau projet s'affiche.
Dans la boîte de dialogue Ajouter un nouveau projet, sous le nœud Visual c#, sélectionnez le nœud de Silverlight pour Windows Phone.
Dans le volet modèles, choisissez le modèle d'Application de liste SharePoint Windows Phone.
Nom de l'application, par exemple, OrdersSPListAppet cliquez sur OK.
Suivez la procédure décrite dans Guide pratique pour créer une application de liste SharePoint Windows Phone pour créer un autre projet d’application Windows Phone, en spécifiant une liste SharePoint définie en fonction des colonnes et des types de champs affichés dans le tableau 1 comme liste cible pour le projet. You should now have two projects in your solution, named "CustomersSPListApp" and "OrdersSPListApp" (if you are following the naming conventions in this procedure).
Dans L'Explorateur de solutions, choisissez le nœud du projet CustomerSPListApp.
Dans le menu projet, choisissez Ajouter une référence.
La boîte de dialogue Ajouter une référence s'affiche.
Sous l'onglet projets, cliquez sur le projet OrdersSPListApp dans la solution, puis cliquez sur le bouton OK. Le projet est ajouté sous le nœud références du projet CustomersSPListApp.
Ensuite, configurez les deux projets dans la solution. Vous configurez essentiellement le projet OrdersSPListApp (basé sur la liste des commandes) pour fonctionner comme un projet de « recherche » pour le projet CustomerSPListApp (basé sur la liste des clients).
Pour configurer le projet OrdersSPListApp
Modifiez les chemins d'accès de navigation dans les formulaires d'affichage du projet OrdersSPListApp pour inclure l'espace de noms principal du projet (« OrdersSPListApp ») et la désignation de « composant ». Par exemple, dans le gestionnaire de l’événement OnNewButtonClick dans le fichier List.xaml.cs du projet OrdersSPListApp, remplacez l’appel à la méthode Navigate de l’objet NavigationService à partir de ce qui suit :
NavigationService.Navigate(new Uri("/Views/NewForm.xaml", UriKind.Relative));
par :
NavigationService.Navigate(new Uri("/OrdersSPListApp;component/Views/NewForm.xaml", UriKind.Relative));
Pour apporter ces modifications, le plus simple consiste à utiliser la commande Remplacer rapide dans le projet OrdersSPListApp.
Dans L'Explorateur de solutions, choisissez le nœud du projet OrdersSPListApp.
Appuyez sur Ctrl + S pour afficher la boîte de dialogue Remplacer rapide.
Dans la zone de texte Rechercher, spécifiez le texte suivant exactement tel qu'il apparaît ici :
Uri("/Views/
Dans la zone de texte Remplacer par, spécifiez le texte suivant exactement tel qu'il apparaît ici :
Uri("/OrdersSPListApp;component/Views/
Assurez-vous que le Projet actuel est sélectionné dans la liste déroulante Rechercher dans.
Cliquez sur Remplacer tout.
Enregistrez tous les fichiers modifiés dans le projet.
Ajoutez une propriété membre au fichier App.xaml.cs du projet OrdersSPListApp. Dans l’Explorateur de solutions, sous le nœud de projet OrdersSPListApp, choisissez le fichier App.xaml .
Appuyez sur F7 pour ouvrir le fichier code-behind associé, App.xaml.cs, pour modification.
Dans le bloc de code (délimité par ouvrante et fermante accolades) qui implémente la classe partielle App, ajoutez le code suivant.
public static string CustomerName { get; set; }
Dans l’Explorateur de solutions, sous le nœud de projet OrdersSPListApp, choisissez le fichier List.xaml .
Appuyez sur F7 pour ouvrir le fichier code-behind associé, List.xaml.cs, pour modification.
Modifiez le Gestionnaire d'événements OnNavigatedTo dans le fichier pour analyser la propriété QueryString de l'objet NavigationContext pour définir la valeur de la variable CustomerName déclarée à l'étape 4. Vous pouvez également définir la propriété Header du contrôle PivotItem sur le formulaire de liste correspondant au nom du client, pour le confort de vos utilisateurs. Le Gestionnaire de modification doit être comme suit.
protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e) { base.OnNavigatedTo(e); if (this.NavigationContext.QueryString.ContainsKey("CustomerName")) { App.CustomerName = NavigationContext.QueryString["CustomerName"]; } // Also set the value of the Header property for the PivotItem to match the customer name. if (!string.IsNullOrWhiteSpace(App.CustomerName)) { this.View1.Header = App.CustomerName; } App.MainViewModel.ViewDataLoaded += new EventHandler<ViewDataLoadedEventArgs>(OnViewDataLoaded); App.MainViewModel.InitializationCompleted += new EventHandler<InitializationCompletedEventArgs>(OnViewModelInitialization); }
Ajoutez la variable CustomerName en tant qu’argument dans l’appel à la méthode LoadData dans le gestionnaire d’événements OnPivotItemLoaded dans le fichier List.xaml.cs . L'implémentation du Gestionnaire d'événements OnPivotItemLoaded doit être comme suit.
private void OnPivotItemLoaded(object sender, PivotItemEventArgs e) { if (!App.MainViewModel.IsInitialized) { //Initialize ViewModel and Load Data for PivotItem upon initialization. App.MainViewModel.Initialize(); } else { //Load Data for the currently loaded PivotItem. App.MainViewModel.LoadData(e.Item.Name, App.CustomerName); } }
La méthode LoadData de la classe ListViewModel dans le modèle est définie comme pour être en mesure d'accepter les paramètres facultatifs.
Ajoutez également la variable CustomerName en tant qu'argument dans l'appel à la méthode LoadData dans le Gestionnaire d'événements OnViewModelInitialization. L'implémentation du Gestionnaire d'événements OnViewModelInitialization doit être comme suit.
private void OnViewModelInitialization(object sender, InitializationCompletedEventArgs e) { this.Dispatcher.BeginInvoke(() => { //If initialization has failed, show error message and return. if (e.Error != null) { MessageBox.Show(e.Error.Message, e.Error.GetType().Name, MessageBoxButton.OK); return; } App.MainViewModel.LoadData(((PivotItem)Views.SelectedItem).Name, App.CustomerName); this.DataContext = (sender as ListViewModel); }); }
Ajoutez la variable CustomerName en tant qu’argument dans l’appel à la méthode RefreshData dans le gestionnaire d’événements OnRefreshButtonClick dans le fichier List.xaml.cs . L'implémentation du Gestionnaire d'événements OnRefreshButtonClick doit être comme suit.
private void OnRefreshButtonClick(object sender, EventArgs e) { if (Views.SelectedItem == null) return; if (!App.MainViewModel.IsInitialized) { //Initialize ViewModel and Load Data for PivotItem upon completion. App.MainViewModel.Initialize(); } else { //Refresh Data for the currently loaded PivotItem. App.MainViewModel.RefreshData(((PivotItem)Views.SelectedItem).Name, App.CustomerName); } }
Comme pour la méthode LoadData, la méthode RefreshData est également définie pour être en mesure d'accepter les paramètres facultatifs. Notez que dans les trois étapes précédentes, le seul changement pour les gestionnaires d'événements générés par le modèle de l'ajout de la variable CustomerName en tant qu'argument dans l'appel aux méthodes LoadData ou RefreshData.
Lorsque les utilisateurs choisissent le bouton Nouveau dans le formulaire de liste pour la liste des commandes dans votre application, le champ client dans le nouveau formulaire doit contenir déjà le nom du client, car la liste des commandes affichées à l'utilisateur a été filtrée basé sur le nom du client. Nouvelles commandes ajoutées à partir de cette liste filtrée doivent être associés avec le nom du client sur lequel la liste est filtrée. Pour passer la valeur de la variable CustomerName dans le nouveau formulaire, modifiez l'événement OnNewButtonClick pour inclure la valeur comme une chaîne de requête dans le chemin d'accès de navigation vers le nouveau formulaire, comme indiqué dans le code suivant.
private void OnNewButtonClick(object sender, EventArgs e) { //Instantiate a new instance of NewItemViewModel and go to NewForm. App.MainViewModel.CreateItemViewModelInstance = new NewItemViewModel { DataProvider = App.DataProvider }; if (!string.IsNullOrWhiteSpace(App.CustomerName)) { NavigationService.Navigate(new Uri("/OrdersSPListApp;component/Views/NewForm.xaml?CustomerName=" + App.CustomerName, UriKind.Relative)); } else { NavigationService.Navigate(new Uri("/OrdersSPListApp;component/Views/NewForm.xaml", UriKind.Relative)); } }
Dans le Gestionnaire d'événements OnNavigatedTo du nouveau formulaire, vérifiez la chaîne de requête pour un nom de client et, si elle est disponible, l'assigner au champ Customer de ViewModel pour le formulaire. Dans l’Explorateur de solutions, sous le projet OrdersSPListApp, choisissez le fichier NewForm.xaml et appuyez sur F7 pour ouvrir le fichier code-behind associé, NewForm.xaml.cs, pour modification.
Modifiez le Gestionnaire d'événements OnNavigatedTo dans le fichier pour faire correspondre le code suivant.
protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e) { base.OnNavigatedTo(e); if (this.NavigationContext.QueryString.ContainsKey("CustomerName")) { this.viewModel["Customer"] = NavigationContext.QueryString["CustomerName"]; } viewModel.ItemCreated += new EventHandler<ItemCreatedEventArgs>(OnItemCreated); }
Dans la classe CamlQueryBuilder du fichier ListDataProvider.cs du projet OrdersSPListApp, ajoutez une clause WHERE au champ Customer dans la requête CAML utilisée pour obtenir des éléments de la liste Commandes afin de filtrer la liste en fonction d’un nom de client donné (à partir de la variable CustomerName ). Ajouter un paramètre à la méthode GetCamlQuery dans la classe pour transmettre le nom du client. La classe modifié CamlQueryBuilder doit être comme suit.
public static class CamlQueryBuilder { static Dictionary<string, string> ViewXmls = new Dictionary<string, string>() { {"View1", @"<View><Query>{0}</Query><RowLimit>30</RowLimit><ViewFields>{1}</ViewFields></View>"} }; static string ViewFields = @"<FieldRef Name='Title'/><FieldRef Name='Unit_x0020_Price'/><FieldRef Name='Quantity'/><FieldRef Name='Order_x0020_Value'/><FieldRef Name='Order_x0020_Date'/><FieldRef Name='Status'/><FieldRef Name='Customer'/>"; public static CamlQuery GetCamlQuery(string viewName, string customerName) { string queryClause = string.Empty; // Create appropriate Query Clause, depending on customerName parameter. if (string.IsNullOrWhiteSpace(customerName)) { queryClause = "<OrderBy><FieldRef Name='ID' /></OrderBy>"; } else { queryClause = string.Format("<Where><Eq><FieldRef Name='Customer' /><Value Type='Text'>{0}</Value></Eq></Where>", customerName); } // Add Query Clause and ViewFields to ViewXml. string viewXml = ViewXmls[viewName]; viewXml = string.Format(viewXml, queryClause, ViewFields); return new CamlQuery { ViewXml = viewXml }; } }
Modifiez la méthode LoadDataFromServer dans le fichier ListDataProvider.cs pour rechercher l’argument CustomerName et passez l’argument à la méthode GetCamlQuery . La méthode modifiée doit être comme suit.
private void LoadDataFromServer(string ViewName, Action<LoadViewCompletedEventArgs> loadItemCompletedCallback, params object[] filterParameters) { string customerName = string.Empty; string cacheKey = ViewName; // Parse the optional parameters: if (filterParameters.Length > 0) { customerName = filterParameters[0].ToString(); cacheKey += "-" + customerName; } CamlQuery query = CamlQueryBuilder.GetCamlQuery(ViewName, customerName); ListItemCollection items = Context.Web.Lists.GetByTitle(ListTitle).GetItems(query); Context.Load(items); Context.Load(items, listItems => listItems.Include(item => item.FieldValuesAsText)); Context.ExecuteQueryAsync( delegate(object sender, ClientRequestSucceededEventArgs args) { base.CacheView(cacheKey, items); loadItemCompletedCallback(new LoadViewCompletedEventArgs { ViewName = ViewName, Items = base.GetCachedView(cacheKey) }); }, delegate(object sender, ClientRequestFailedEventArgs args) { loadItemCompletedCallback(new LoadViewCompletedEventArgs { Error = args.Exception }); }); }
De même, modifiez la méthode LoadData dans le fichier ListDataProvider.cs pour traiter le paramètre CustomerName .
public override void LoadData(string ViewName, Action<LoadViewCompletedEventArgs> loadViewCompletedCallback, params object[] filterParameters) { string customerName = string.Empty; string cacheKey = ViewName; // Parse the optional parameters: if (filterParameters.Length > 0) { customerName = filterParameters[0].ToString(); cacheKey += "-" + customerName; } List<ListItem> CachedItems = GetCachedView(cacheKey); if (CachedItems != null) { loadViewCompletedCallback(new LoadViewCompletedEventArgs { ViewName = ViewName, Items = CachedItems }); return; } LoadDataFromServer(ViewName, loadViewCompletedCallback, filterParameters); }
Ajoutez un bouton Annuler à l'élément ApplicationBar dans le fichier List.xaml dans le projet OrdersSPListApp. Dans L'Explorateur de solutions, sous le nœud OrdersSPListApp, choisissez le fichier List.xaml et appuyez surMAJ + F7Pour ouvrir le fichier pour modification dans le concepteur.
Ajoutez XAML pour déclarer un bouton Annuler au sein de la balise
<phone:PhoneApplicationPage.ApplicationBar>
, comme indiqué dans le balisage suivant.<phone:PhoneApplicationPage.ApplicationBar> <shell:ApplicationBar IsVisible="True" IsMenuEnabled="True"> <shell:ApplicationBarIconButton x:Name="btnNew" IconUri="/Images/appbar.new.rest.png" Text="New" Click="OnNewButtonClick"/> <shell:ApplicationBarIconButton x:Name="btnRefresh" IconUri="/Images/appbar.refresh.rest.png" Text="Refresh" IsEnabled="True" Click="OnRefreshButtonClick"/> <shell:ApplicationBarIconButton x:Name="btnCancel" IconUri="/Images/appbar.cancel.rest.png" Text="Cancel" IsEnabled="True" Click="OnCancelButtonClick" /> </shell:ApplicationBar> </phone:PhoneApplicationPage.ApplicationBar>
Le fichier List.xaml est sélectionné dans L'Explorateur de solutions, puis appuyez surF7Pour ouvrir le fichier code-behind associé, List.xaml.cs, pour la modification.
Dans le bloc de code (délimité par ouvrante et fermante accolades) qui implémente la classe partielle ListForm, ajoutez le gestionnaire pour l'événement OnCancelButtonClick suivant.
private void OnCancelButtonClick(object sender, EventArgs e) { NavigationService.Navigate(new Uri("/CustomersSPListApp;component/Views/DisplayForm.xaml", UriKind.Relative)); }
Enregistrez les fichiers dans le projet.
Il reste maintenant, pour ajouter un bouton au formulaire d'affichage dans le projet CustomersSPListApp pour afficher les commandes associées à un client donné.
Pour configurer le projet CustomersSPListApp
Dans L'Explorateur de solutions, sous le nœud du projet CustomersSPListApp, choisissez le fichier DisplayForm.xaml.
AppuyezMAJ + F7(ou double-cliquez sur le fichier) pour ouvrir le fichier pour modification dans le concepteur.
Ajoutez les déclarations de XAML pour un contrôle Button au sein d'un contrôle StackPanel contenant une fois le conteneur du contrôle final StackPanel pour le dernier champ de l'élément de liste, comme dans le balisage suivant.
<Grid x:Name="LayoutRoot" Background="Transparent" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:controls="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone.Controls"> <StackPanel> <ProgressBar Background="Red" x:Name="progressBar" Opacity="1" HorizontalAlignment="Center" VerticalAlignment="Top" Height="15" Width="470" IsIndeterminate="{Binding IsBusy}" Visibility="{Binding ShowIfBusy}" /> <ScrollViewer HorizontalScrollBarVisibility="Auto" Height="700"> <Grid x:Name="ContentPanel" Width="470"> <StackPanel Margin="0,5,0,5"> <StackPanel HorizontalAlignment="Left" Orientation="Horizontal" Margin="0,5,0,5"> <TextBlock TextWrapping="Wrap" Width="150" HorizontalAlignment="Left" Style="{StaticResource PhoneTextNormalStyle}">Title :</TextBlock> <TextBlock Width="310" HorizontalAlignment="Left" Name="txtTitle" Text="{Binding [Title]}" TextWrapping="Wrap" Style="{StaticResource PhoneTextSubtleStyle}" /> </StackPanel> <StackPanel HorizontalAlignment="Left" Orientation="Horizontal" Margin="0,5,0,5"> <TextBlock TextWrapping="Wrap" Width="150" HorizontalAlignment="Left" Style="{StaticResource PhoneTextNormalStyle}">Contact Number :</TextBlock> <TextBlock Width="310" HorizontalAlignment="Left" Name="txtContact_x0020_Number" Text="{Binding [Contact_x0020_Number]}" TextWrapping="Wrap" Style="{StaticResource PhoneTextSubtleStyle}" /> </StackPanel> <StackPanel HorizontalAlignment="Left" Orientation="Horizontal" Margin="0,5,0,5"> <TextBlock TextWrapping="Wrap" Width="150" HorizontalAlignment="Left" Style="{StaticResource PhoneTextNormalStyle}">E-mail Address :</TextBlock> <TextBlock Width="310" HorizontalAlignment="Left" Name="txtE_x002d_mail_x0020_Address" Text="{Binding [E_x002d_mail_x0020_Address]}" TextWrapping="Wrap" Style="{StaticResource PhoneTextSubtleStyle}" /> </StackPanel> <StackPanel HorizontalAlignment="Left" Orientation="Horizontal" Margin="0,5,0,5"> <TextBlock TextWrapping="Wrap" Width="150" HorizontalAlignment="Left" Style="{StaticResource PhoneTextNormalStyle}">Company :</TextBlock> <TextBlock Width="310" HorizontalAlignment="Left" Name="txtCompany" Text="{Binding [Company]}" TextWrapping="Wrap" Style="{StaticResource PhoneTextSubtleStyle}" /> </StackPanel> <StackPanel Margin="0,60,0,5"><Button Content="Get Orders" Height="70" Name="OrdersButton" Width="400" Click="OnButtonOrdersClick" /></StackPanel> </StackPanel> </Grid> </ScrollViewer> </StackPanel> </Grid>
Le fichier DisplayForm.xaml est sélectionné dans L'Explorateur de solutions, puis appuyez surF7Pour ouvrir le fichier code-behind associé, DisplayForm.xaml.cs, pour la modification.
Dans le bloc de code (délimité par ouvrante et fermante accolades) qui implémente la classe partielle DisplayForm, ajoutez le gestionnaire pour l'événement OnButtonOrdersClick suivant.
private void OnOrdersButtonClick(object sender, RoutedEventArgs e) { this.NavigationService.Navigate(new Uri("/OrdersSPListApp;component/Views/List.xaml?CustomerName=" + viewModel["Title"], UriKind.Relative)); }
Enregistrez le fichier.
Si vous générez la solution et déployez dans l'émulateur de Windows Phone, le formulaire de liste pour la liste des clients s'affiche. Si vous choisissez un élément dans la liste pour afficher le formulaire d'affichage pour un client donné, vous voyez un bouton permettant de récupérer les commandes associées à ce client (Figure 1).
Figure 1. Formulaire d’affichage des clients
Lorsque vous choisissez le bouton Get Orders sur ce formulaire d'affichage, les commandes du client sont affichés dans le formulaire de liste à partir du projet OrdersSPListApp dans la solution (Figure 2).
Figure 2. Formulaire de liste des commandes
À partir de ce formulaire (le formulaire de liste pour la liste des commandes), vous pouvez ajouter, modifier ou supprimer des commandes d'un client. Si vous choisissez le bouton Annuler, vous accédez au formulaire de liste pour la liste des clients. Dans une application de téléphone unique, vous pouvez gérer les éléments de liste à partir de deux listes SharePoint.
Voir aussi
- Procédure : Configurer et utiliser les notifications Push dans les applications SharePoint pour Windows Phone
- Comment : configurer un environnement pour le développement d'applications mobiles pour SharePoint
- Windows Phone SDK 8.0
- Kit de développement logiciel Microsoft SharePoint pour Windows Phone 8
- Windows Phone SDK 7.1
- Microsoft SharePoint SDK pour Windows Phone 7.1