1

背景: Silverlight3 / C#/。Netでの3〜4週間の経験、およびRIAサービスの概念での約3日間の価値。(これまでの私の以前の質問のほとんどは、その理由を説明する必要があります)

私はSilverlight3を使用してMicrosoftのRIAサービスのテスト実装を行っています。これは、クライアントのために私がしなければならない概念実証の一部です。とても基本的です。RIAサービスなどを使用してSilverlight3プロジェクトを構築する方法を理解しました。したがって、文字列とintの受け渡しは、現時点では問題ありません。

ただし、ドメインサービスクラスからSL3クライアントにArrayListを返す必要があります。ただし、ArrayListをそのまま返すことは許可されていないようです。そして、C#に関する私の限られた知識は、クイック型キャスト/変換などを行うのに役立ちません。このサーバー側の関数は、SL3クライアントに返す必要があるArrayListを取得するため、クライアント側に送信するために何かを行う必要があります。

質問: DomainServiceクラス関数が呼び出し元のクライアント/ SL3関数に返すことができるようにArrayList(c#)に対して何をすべきか知っている人はいますか?

[注:私の試みの大部分はすべてエラーで終了します:「'myFunctionName'という名前のサービス操作は必要な署名に準拠していません。戻り値とパラメーターの両方のタイプはエンティティタイプまたは事前定義されたシリアル化可能なタイプの1つである必要があります。」]

適切と思われる情報があれば、遠慮なくリクエストしてください。前もって感謝します。

4

2 に答える 2

2

私が見つけた解決策を投稿しなかったことをお詫びします。ボスは私が扱える以上の仕事を私に投げかけた。:)私の解決策は最善ではないかもしれないことに注意してください、しかしSLとRIAサービスに関する私の知識はとても新しいので、私はそれが許されるかもしれないと思います。当初は、クライアントから提供されたコードからかなり複雑な配列を返したかったのですが、労力と時間の制約により、リストを正しく変換して返すことしかできませんでした。これが何らかの形で役立つことを願っています。

クライアント側:MainPage.xaml.csのSilverlightコードサーバー側からデータのリストを取得して、ドロップダウンリストに表示するための呼び出しがあります。

// 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;
}

ドメインサービスクラスには、関連する機能があります。

    [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

于 2009-11-26T12:13:20.330 に答える
1

ArrayList を返せるかどうかわからない。サービスにメソッドを Read メソッドとして認識させる代わりに IEnumerable を返すことを考えるべきだと思います。

List または ObservableCollection があり、ComboBox などの ItemControl にバインドする場合は、ItemControl に ItemsSource を設定できます。ItemControl の DisplayPath プロパティを使用して、表示するプロパティを設定するか、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>
于 2009-10-26T18:30:29.890 に答える