Question

Contexte: Trois à quatre semaines d'expérience dans Silverlight3 / C # /. Net et environ trois jours avec le concept des services RIA. (la plupart de mes questions précédentes à ce jour devraient expliquer pourquoi)

Je teste actuellement la mise en œuvre des services RIA de Microsoft avec Silverlight3. Cela fait partie d'une preuve de concept que je dois faire pour un client. Donc, c'est très basique. J'ai compris comment construire le projet Silverlight3 en utilisant les services RIA, etc. Ainsi, passer et renvoyer des chaînes et des entiers n'est pas un problème pour le moment.

Mais je dois renvoyer une liste de tableaux de ma classe de service de domaine à mon client SL3. Mais il semble que renvoyer une ArrayList en l'état n'est pas autorisé. Et ma connaissance limitée de C # n’aide pas à effectuer des transtypages / conversions de type rapide / etc. Cette fonction côté serveur obtient un ArrayList qui doit être renvoyé au client SL3. Je dois donc en faire quelque chose pour l'envoyer côté client.

Question: Est-ce que quelqu'un sait ce qu'il faut faire à un ArrayList (en c #) pour permettre à une fonction de classe DomainService de le renvoyer à une fonction client / SL3 appelante?

[ REMARQUE ": la plupart de mes tentatives aboutissent toutes à l'erreur:" L'opération de service nommée "myFunctionName" n'est pas conforme à la signature requise. Les types de retour et de paramètre doivent être un type d'entité ou l'un des types sérialisables prédéfinis. "]

N'hésitez pas à demander toute information que vous jugez utile. Merci d'avance.

Était-ce utile?

La solution

Mes excuses pour ne pas avoir posté la solution que j'ai trouvée. Les patrons m'ont jeté plus de travail que je ne pouvais en supporter. :) Veuillez noter que ma solution n'est peut-être pas la meilleure, mais comme mes connaissances en matière de services SL et RIA sont tellement nouvelles, je suppose que cela peut être excusé. Au départ, je voulais renvoyer des tableaux assez compliqués à partir du code fourni par notre client, mais les contraintes d’effort et de temps nous ont permis de n’avoir que le droit de convertir et de renvoyer une liste. J'espère que cela vous aidera d'une certaine manière.

Côté client: Code Silverlight dans MainPage.xaml.cs, je suis appelé à récupérer une liste de données côté serveur, à afficher dans une liste déroulante.

// Function called on load of the SL interface
// 'slayer' is an object of the Domain Service Class server-side
// 'this.gidSessionNumber' is just a number used in the demo to represent a session
public void loadPaymentTypeComboBox()
{
    InvokeOperation<IEnumerable<string>> comboList = sLayer.getPaymentTypeCombo(this.gidSessionNumber);
    comboList.Completed += new EventHandler(popPaymentCombo_complete);
}//function loadAllComboBoxes

// Event handler assigned
public void popPaymentCombo_complete(object sender, EventArgs e)
{
    InvokeOperation<IEnumerable<string>> obj = (InvokeOperation<IEnumerable<string>>)sender;
    string[] list = obj.Value.ToArray();

    // 'paymentTypeDropdown' is the name of the specific comboBox in the xaml file
    paymentTypeDropdown.IsEnabled = true;

    // Assign the returned arrayList as itemSource to the comboBox
    paymentTypeDropdown.ItemsSource = list;
}

Dans la classe de service de domaine, j'ai la fonction associée:

    [ServiceOperation]
    public List<string> getPaymentTypeCombo(string gidNumber)
    {
        // Build objects from libraries provided by our client
        SDT.Life.LifeCO.clsSystemCreator.CreateSysObjects(gidNumber);
        this.lobjSys = SDT.Life.LifeCO.clsSystemCreator.GetSysObject(gidNumber);

        // Rtrieve the ArrayList from the client's code       
        clsTextList comboList= this.lobjSys.lstPaymentType_PaymentQueue;

        // Get the length of the returned list
        int cnt= (int)comboList.Count();

        // Create the List<string> which will be populated and returned
        List<string> theList= new List<string>();

        // Copy each element from the clsTextList to the List<string>
        for (int i = 0; i < cnt;i++)
        {
            string status= comboList.Item(i).Description;
            theList.Add(status);
        }

        // return the newly populated List<string>
        return theList;
    }//end function getPaymentTypeCombo

Autres conseils

Vous n'êtes pas sûr de pouvoir renvoyer une liste de tableaux. Je suppose que vous devriez plutôt penser à renvoyer un IEnumerable, ce qui permettra au service de reconnaître la méthode comme une méthode de lecture.

Si vous avez une liste ou ObservableCollection et souhaitez le lier à un ItemControl tel que ComboBox, vous pouvez définir le ItemsSource sur votre ItemControl. Utilisez la propriété DisplayPath sur ItemControl pour définir la propriété que vous souhaitez afficher ou utiliser un DataTemplate.

<ComboBox>
  <ComboBox.ItemTemplate>
    <DataTemplate>
      <StackPanel Orientation="Horizontal">
        <TextBlock Text={"Binding Path=Property1"}/>
        <TextBlock Text={"Binding Path=Property2"}/>
        <TextBlock Text={"Binding Path=Property3"}/>
      </StackPanel>
    </DataTemplate>
  </ComboBox.ItemTemplate>
</ComboBox>
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top