2011-12-27 15 views
0

Windows Phoneアプリケーションからjson webserviceを使用して、取得したデータをリストボックスに表示しようとしています。 Webサービス(e.result内)からデータを取得できましたが、リストボックスにデータを取得できません。 以下は私のxamlコードです。json webserviceのデータをWindows phoneのリストボックスに表示できません。7.1アプリケーション

<Grid x:Name="ContentPanel" Grid.Row="2" Margin="12,0,12,0"> 
     <Grid.Background> 
      <SolidColorBrush Color="Black" > 
      </SolidColorBrush> 
      <!--<ImageBrush ImageSource="/images/[email protected]" 5F91F5/>--> 
     </Grid.Background> 
     <ListBox x:Name="carslist" Padding="0,0,0,0" HorizontalAlignment="Center" VerticalAlignment="Top" > 
      <ListBox.ItemTemplate> 
       <DataTemplate> 
        <Border Margin="3" Height="50"> 
         <StackPanel Background="Transparent" Orientation="Vertical" Width="420" Height="60"> 
          <StackPanel Background="Transparent" Orientation="Horizontal" Width="420" Height="60"> 
           <TextBlock Foreground="White" HorizontalAlignment="Left" TextWrapping="NoWrap" VerticalAlignment="Center" FontSize="26" Text="{Binding cartype}"/> 
           <TextBlock Foreground="White" HorizontalAlignment="Left" TextWrapping="NoWrap" VerticalAlignment="Center" FontSize="26" Text="{Binding carcode}"/> 
          </StackPanel> 
         </StackPanel> 
        </Border> 
       </DataTemplate> 
      </ListBox.ItemTemplate> 
     </ListBox> 
    </Grid> 

以下は私のxaml.csコードです。

public MainPage() 
    { 
     InitializeComponent(); 
     string key = "123"; 
     WebClient getcars = new WebClient(); 
     getcars.DownloadStringCompleted += new DownloadStringCompletedEventHandler(getcars_DownloadStringCompleted); 
     getcars.DownloadStringAsync(new Uri("http://myurl?key=" + "{" + key + "}")); 

    } 


    void getcars_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e) 
    { 
     Stream stream = new MemoryStream(Encoding.Unicode.GetBytes(e.Result)); 
     DataContractJsonSerializer obj = new DataContractJsonSerializer(typeof(List<cars>)); 
     List<cars> result = obj.ReadObject(stream) as List<cars>; 
     carslist.ItemsSource = result; 

    } 

} 

public class cars 
{ 
    public string carcode { get; set; } 
    public string cartitle { get; set; } 
    public string cartype { get; set; } 
    public string carid { get; set; } 
} 

誰かが私の問題を解決するのに役立つでしょうか...事前に感謝します。

+0

あなたの問題を解決するかどうかわかりませんが、プロパティに結果を追加し、リストボックスのItemsSourceにこのプロパティをバインドしようとするので、うまくいきます。私はあなたのプロジェクトでMVVMを試してみることをお勧めします。 – BigL

答えて

0

なぜ動作しないのかは明らかです。 List<cars> resultは、そのハンドラのローカルスコープを持つgetcars_DownloadStringCompletedハンドラのローカル変数として作成されるため、このハンドラの終了時にすぐにガベージコレクトされます。 なぜデータが表示されないのですか?この問題を解決するために

、たとえば

public ObservableCollection<cars> Results {get;set;} 

とgetcars_DownloadStringCompletedハンドラ内のためにあなたのページにパブリックプロパティを作成するには、それにあなたの結果を追加するコレクションを結果。次に、コードでこれを行います:

carslist.ItemsSource = this.Results; 

これはうまくいくはずです。

結果コレクションを追加する前に、JSonサービスから逆シリアル化したアイテムが有効であることも確認してください。私はブレークポイントを結果コレクションにアイテムを割り当てる行にデバッガに入れ、本当に何かが本当に追加されていることを確認します。

車のクラスでINotifyPropertyChangedを実装する必要があります。

+0

あなたはおそらく 'carslist.ItemsSource = result;'に気付かず、別のルートを追加し、そのリストはガベージコレクションされません。 –

関連する問題