2011-05-31 16 views
5

HTTPサーバーからjsonレスポンスを読み取るコードが少しあります。次に、これを解析してデータをListBoxコントロールに挿入します。ダウンロードが完了すると、私はオフに火リストボックスによるデータバインディング

イベントは以下の通りです:

void webClient_OpenReadCompleted(object sender, OpenReadCompletedEventArgs e) 
{ 
    DataContractJsonSerializer ser = null; 

    try 
    { 
     ser = 
     new DataContractJsonSerializer(typeof(ObservableCollection<UserLeaderboards>)); 

     ObservableCollection<UserLeaderboards> users = 
      ser.ReadObject(e.Result) as ObservableCollection<UserLeaderboards>; 

     foreach (UserLeaderboards em in users) 
     { 
      int Fid = em.id; 
      string Fusername = em.username; 
      int Fscore = em.score; 
      lstbLeaders.Items.Add(Fid + Fusername + Fscore); 
     } 
    } 
    catch (Exception ex) 
    { 
     MessageBox.Show(ex.Message); 
    } 
} 

私はitems.addを行うとき、私はそれだけで3つの変数を結ぶとListBoxに1列に追加しています推測。これは正常に動作し、私はすべての3つの項目が表示され、表示されます。

これを分けて見栄えを良くして、を作成して変数をtextblocksにバインドしようとします。以下は、ユーザー名をバインドするだけです。私はまた、3つの変数すべてを取得/設定するパブリッククラスを持っています。

<ListBox Height="346" HorizontalAlignment="Left" Margin="5,221,0,0" 
     Name="lstbLeaders" VerticalAlignment="Top" Width="446"> 
    <DataTemplate>        
     <TextBlock Text="{Binding Source=Fusername}" />       
    </DataTemplate> 
</ListBox> 

上記を実行すると、何も表示されません。私はそれが何か簡単だと感じていますか?

ありがとうございました。

答えて

5

を試してみてください :

<ListBox Height="346" HorizontalAlignment="Left" Margin="5,221,0,0" 
     Name="lstbLeaders" VerticalAlignment="Top" Width="446"> 
    <ListBox.ItemTemplate> 
     <DataTemplate>        
      <TextBlock Text="{Binding}" />       
     </DataTemplate> 
    <ListBox.ItemTemplate> 
</ListBox> 

をし、あなたが作るためにプロパティを分割したい場合は、単純な文字列ではなくオブジェクトを提供する必要がありますそれはよりよく見えます。 Fid + Fusername + Fscoreを追加するだけで、普通の文字列になります。

<ListBox Height="346" HorizontalAlignment="Left" Margin="5,221,0,0" 
     Name="lstbLeaders" VerticalAlignment="Top" Width="446"> 
    <ListBox.ItemTemplate> 
     <DataTemplate>        
      <StackPanel Orientation="Horizontal"> 
       <TextBlock Text="{Binding Id}" />       
       <TextBlock Text="{Binding Name}" />       
       <TextBlock Text="{Binding Score}" />       
      </StackPanel> 
     </DataTemplate> 
    <ListBox.ItemTemplate> 
</ListBox> 

あなたは、ビュークラスが必要になります。なぜにdirecectly ObservableCollection<UserLeaderboards>を結合しない

  • :背後にあるコード内の

    public class UserView 
    { 
        public string Id {get;set;} 
        public string Name {get;set;} 
        public int Score {get;set;} 
    } 
    

    var usersList = new List<UserView>(); 
    
    foreach (UserLeaderboards em in users) 
    { 
        int Fid = em.id; 
        string Fusername = em.username; 
        int Fscore = em.score; 
        usersList.Add(new UserView { Id = Fid, Name = Fusername, Score = Fscore}); 
    } 
    
    lstbLeaders.ItemsSource = usersList; 
    

    また、ノートをリストボックス?

コードのforeach一部を省略して単にlstbLeaders.ItemsSource = users;を設定する他の型に変換する理由がない場合。

void webClient_OpenReadCompleted(object sender, OpenReadCompletedEventArgs e) 
{ 
    try 
    { 
     var ser = new DataContractJsonSerializer(
        typeof(ObservableCollection<UserLeaderboards>)); 

     var users = ser.ReadObject(e.Result) 
         as ObservableCollection<UserLeaderboards>; 

     lstbLeaders.ItemsSource = users; 
    } 
    catch (Exception ex) 
    { 
     MessageBox.Show(ex.Message); 
    } 
} 
  • MVVMパターンを見てみましょう。 XAMLを使用する場合は、これについて知っておく必要があります。作業が簡単になり、よりクリーンなコードが作成されます。

  • 編集機能を追加したい場合、またはデータを変更する場合は、ViewクラスにINotifyPropertyChangedを実装する必要があります。

  • 煩雑なクラス名を扱うときに特に役立つ型推論を使用できます。 var list = new ObservableCollection<SomeLongTypeName>()は、多くの入力と画面の不動産を節約します。

  • ハンガリアン記法私はうんざりなります;)

+0

私はリストボックスに直接バインドしない理由はありません。私の知識は物事のXAML側の非常に高いものではありません。私は単純なlstbLeaders.ItemsSource = usersで自分のプロジェクトを編集しました。あなたの投稿ごとにuserviewクラスを維持する。私は今、各行に00を取得します。 – Nathan

+0

XAMLはどのように見えますか?コレクションの値が設定されている場合、またはデシリアライズでエラーが発生した場合は、デバッガを使用してチェックします。あなたのコードを適応させた新しいコードスニペットを追加しました。あなたのXAMLは 'UserLeaderboards'クラスのプロパティにバインドする必要があります:' id'、 'username'、' score'。 – Zebi

+0

あなたの助けを借りて、それをソート! – Nathan

1

私はあなたがItemTemplateを見逃したと思います。あなたのXAMLは次のようになります。単純な文字列を表示するには、この

<ListBox Height="346" HorizontalAlignment="Left" Margin="5,221,0,0" Name="lstbLeaders"   VerticalAlignment="Top" Width="446"> 
    <ListBox.ItemTemplate> 
     <DataTemplate>         
      <TextBlock Text="{Binding Source=Fusername}" />      
     </DataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 
+0

私はItemTemplateにタブを追加しましたし、それはまだ何も表示されていません。 – Nathan

+0

コードビハインドでItemSource [lstbLeaders.Itemsource = List ())を設定してみましたか?たぶんフォントは背景と同じであるかもしれません。 :-) – kanchirk

関連する問題