2011-05-31 8 views
5

मेरे पास कुछ कोड है जो एक HTTP सर्वर से एक जेसन प्रतिक्रिया पढ़ता है, फिर यह इसे पार करता है और डेटा को 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 में एक स्तंभ में जोड़ने से है कार्य करें:

घटना मैं बंद आग डाउनलोड पूरा होने पर पीछा कर रहा है । यह ठीक काम करता है और मैं देखता हूं कि सभी 3 आइटम जुड़ गए और प्रदर्शित हुए।

मैं इसे अलग करना चाहता हूं और इसे थोड़ा अच्छा दिखाना चाहता हूं इसलिए मैंने कुछ XAML को टेक्स्टब्लॉक्स में चर को बाध्य करने और बांधने के लिए बनाया है। निम्नलिखित उपयोगकर्ता नाम बस बाध्यकारी है। मेरे पास एक सार्वजनिक वर्ग भी है जो सभी 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

प्रयास करें एक साधारण स्ट्रिंग अपने XAML इस तरह दिखना चाहिए प्रदर्शित करने के लिए:

<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 जोड़ते हैं तो आप एक सादा स्ट्रिंग के साथ समाप्त हो जाएंगे।

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; 

इसके अलावा नोट: पीछे अपने कोड में

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

:

<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> बाध्य नहीं सूची बॉक्स?

अगर कोई अन्य प्रकार कन्वर्ट करने के लिए कोड की foreach हिस्सा छोड़ें और सिर्फ lstbLeaders.ItemsSource = users; सेट कोई कारण नहीं है।

MVVM पैटर्न को
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); 
    } 
} 
  • लें देखो। यदि आप एक्सएएमएल के साथ काम करना चाहते हैं तो आपको इसके बारे में पता होना चाहिए। यह आपके काम को सरल बनाता है और क्लीनर कोड बनाता है।

  • यदि आप संपादन कार्यक्षमता जोड़ना चाहते हैं या डेटा बदल सकता है तो आपको व्यू क्लास पर INotifyPropertyChanged लागू करने की आवश्यकता हो सकती है।

  • आप टाइप अनुमान का उपयोग कर सकते हैं जो विशेष रूप से बोझिल वर्ग नामों के साथ काम करते समय मदद करता है। var list = new ObservableCollection<SomeLongTypeName>() ज्यादा टाइपिंग और स्क्रीन एस्टेट बचाता है।

  • हंगेरी संकेतन मुझे चापलूसी करता है;)

+0

मेरे लिए कोई कारण नहीं है कि सीधे सूची बॉक्स में बाध्य न करें, मेरा ज्ञान चीजों के XAML पक्ष से बहुत अधिक नहीं है। मैंने अपनी परियोजना को एक साधारण lstbLeaders.ItemsSource = उपयोगकर्ताओं के साथ संपादित किया है; अपनी पोस्ट के अनुसार userview कक्षा को रखते हुए। अब मैं सिर्फ प्रत्येक पंक्ति पर 00 प्राप्त करता हूं। – Nathan

+0

आपका एक्सएएमएल कैसा दिखता है? यदि संग्रह मान सेट हैं या deserializing एक त्रुटि प्रस्तुत करता है तो जांचें (डीबगर का उपयोग करके)। मैंने आपके कोड को अपनाने के जवाब में एक नया कोड स्निपेट जोड़ा। आपके XAML को अब 'UserLeaderboards' वर्ग के गुणों से जुड़ना होगा: 'id',' username', 'score'। – Zebi

+0

जो इसे हल करता है, आपकी मदद के लिए धन्यवाद !! – Nathan

1

मुझे लगता है कि आप आइटम टेम्पलेट को याद करते हैं। इस

<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

क्या आपने कोड के पीछे आइटमसोर्स [lstbLeaders.Itemsource = सूची ()) को सेट करने का भी प्रयास किया था? शायद फ़ॉन्ट पृष्ठभूमि के समान ही है। :-) – kanchirk

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^