2011-07-15 6 views
1

これは非常に単純な作業ですが、何時間も苦労しています。 私はWebソースからxmlを解析し、リストボックスにバインドします。今、私はボックスの一覧を表示するためにバインドさ各項目のインデックスを作りたい、このような何か:ここxmlを解析し、リストボックスにデータをバインドする

 
1.Title 2.Title 3.Title 
    Author Author Author 
    Date  Date  Date 

は、私がこれまで持っているものです。

   <ListBox.ItemTemplate> 
       <DataTemplate> 
        <StackPanel Name="stkPnl" Orientation="Horizontal" Margin="15,0" MouseEnter="stkPnl_MouseEnter" MouseLeave="stkPnl_MouseLeave"> 
         <Image x:Name="imageAV" Source="{Binding avlink}" Height="80" Width="80" 
           Stretch="UniformToFill" MouseLeftButtonUp="imageAV_MouseLeftButtonUp" ImageFailed="imageAV_ImageFailed"/> 
         <StackPanel Orientation="Vertical" Margin="10,0,0,0" MouseLeftButtonUp="StackPanel_MouseLeftButtonUp">                
          <TextBlock Text="{Binding nickname}" Width="Auto" />        
          <TextBlock Text="{Binding track}" FontWeight="Bold" Width="Auto"/> 
          <TextBlock Text="{Binding artist}" Width="Auto"/> 
         </StackPanel> 
        </StackPanel> 
       </DataTemplate> 
      </ListBox.ItemTemplate> 

とMainPage.xaml.cs

 private void DoWebClient() 
    { 
     var webClient = new WebClient(); 
     webClient.OpenReadAsync(new Uri("http://music.mobion.vn/api/v1/music/userstop?devid=")); 
     webClient.OpenReadCompleted += new OpenReadCompletedEventHandler(webClient_OpenReadCompleted); 

    } 

    void webClient_OpenReadCompleted(object sender, OpenReadCompletedEventArgs e) 
    { 
     using (var reader = new StreamReader(e.Result)) 
     { 

      string s = reader.ReadToEnd(); 
      Stream str = e.Result; 
      str.Position = 0; 
      XDocument xdoc = XDocument.Load(str); 

      var data = from query in xdoc.Descendants("user") 
         select new mobion 
         { 
          avlink = (string)query.Element("user_info").Element("avlink"), 
          nickname = (string)query.Element("user_info").Element("nickname"), 
          track = (string)query.Element("track"), 
          artist = (string)query.Element("artist"), 
         }; 
      listBox.ItemsSource = data; 
     } 
    } 

ニックネーム、トラック、アーティストのみが表示されているので、各listboxItemごとに増加するインデックスを追加するにはどうすればよいですか? この問題をお読みいただきありがとうございます。

答えて

0

mobion(ビューにバインドできる)という適切なフィールドがあると仮定して、増分カウンタを使用して、ドキュメントが反復されるときにこのフィールドにデータを入力できます。

int[] counter = { 1 };  

var data = from query in xdoc.Descendants("user") 
      select new mobion 
      { 
       index = counter[0]++, 
       avlink = (string)query.Element("user_info").Element("avlink"), 
       nickname = (string)query.Element("user_info").Element("nickname"), 
       track = (string)query.Element("track"), 
       artist = (string)query.Element("artist"), 
      }; 

counterがintの配列ではなく修飾クロージャにアクセス防止するだけint型であることに留意されたいです。

+0

素晴らしい!ありがとうマット –

1

私はそれが醜いと知っているが、それはアイデアだ:あなたのmobionクラスの周りのラッパークラスを作成します。

public class mobionWrapper : mobion 
{ 
    public int Index { get; set; } 
} 

代わりにあなたがmobionWrapperインスタンスを選択mobionインスタンスを選択する:

var data = from query in xdoc.Descendants("user") 
      select new mobionWrapper 
      { 
       avlink = (string)query.Element("user_info").Element("avlink"), 
       nickname = (string)query.Element("user_info").Element("nickname"), 
       track = (string)query.Element("track"), 
       artist = (string)query.Element("artist"), 
      }; 

を結合させた後ラッパークラスのインデックスプロパティを設定します。

listBox.ItemsSource = data; 

for(int i = 0; i < listBox.Items.Count; i++) 
{ 
    var item = listBox.Items[i] as mobionWrapper; 
    item.Index = i + 1; 
} 

これで新しいTextBlockが必要になり、Indexプロパティにバインドされます:

<TextBlock Text="{Binding Index}" Width="Auto" /> 

私のために働きました。データ表示の並べ替えやフィルタリング後にインデックスが無効になる可能性があることに注意してください。

+0

ありがとうZombieHunter! –

関連する問題