2011-07-11 11 views
0

私は自分の論文のためのプログラムに取り組んでいます。うまくいけば、終了したら、タグデータを使って音楽ファイルをソートすることができます。現在、私はwpfツリービューを持っており、アーティスト>アルバム>タイトルでソートされたすべての音楽のリストを表示したいと考えています。 taglib#を使用して収集したタグファイルのリストを各トラックのTreeViewItemsを作成するために使用し、TreeViewに追加することができます。問題は、すでに追加されているアーティスト/アルバムの子としてトラックを追加するのではなく、アーティスト/アルバムの重複を追加しないように思われることです。私はforeachを使ってアイテムを繰り返し処理しようとしていますが、ヘッダー(アーティスト名)が追加する新しいアーティストのヘッダーと一致する場合は、代わりにアルバムに移動して現在のアイテムの子として追加してから同じアルバムのチェックとトラックタイトルへの移動など。私はほとんど喜びを感じていませんが、ヘッダーが正確に一致しても、常に一致しないと返されるようになって、複製者が追加されるためです。どのようにwpf TreeViewのアイテムを繰り返し、新しいアイテムが存在しない場合、または既存のアイテムの子として追加された場合、追加できますか?

私はこれを最善の方法でやっているのか、自分のロジックの欠点があるのか​​、どんな助けでも大いに感謝するだろうと確信していません。

Attatchedは、アイテムの作成と確認に使用しているコードです。

public void PopulateTreeView(TreeView searchResults) 
    { 


     foreach (TagLib.File tagFile in tagFiles) 
     { 
      TreeViewItem Artist; 
      TreeViewItem Album; 
      TreeViewItem Title; 
      //creating the TreeViewItems 
      Artist = SetArtistsName(tagFile); 
      Album = SetAlbumName(tagFile); 
      Title = SetTrackName(tagFile); 
      //adding them to TreeView 
      AddArtistToTreeView(tagFile, searchResults, Artist, Album, Title); 
     } 

    } 

ツリービューに追加するためのTreeViewItems

private TreeViewItem SetArtistsName(TagLib.File tagFile) 
    { 
     TreeViewItem Artist = new TreeViewItem(); 
     if (tagFile.Tag.AlbumArtists.Length == 0) 
     { 
      Artist.Header = "Unknown Artist"; 
      return Artist; 
     } 
     else 
     { 
      Artist.Header = tagFile.Tag.AlbumArtists[0].ToString(); 
      return Artist; 
     } 
    } 

    private TreeViewItem SetAlbumName(TagLib.File tagFile) 
    { 
     TreeViewItem Album = new TreeViewItem(); 
     Album.Header = tagFile.Tag.Album; 
     return Album; 
    } 

    private TreeViewItem SetTrackName(TagLib.File tagFile) 
    { 
     TreeViewItem Track = new TreeViewItem(); 
     Track.Header = tagFile.Tag.Title; 
     return Track; 
    } 

とコードを作成する関数/申し訳ありませんが、これは長い1のビットである重複

 private void AddArtistToTreeView(TagLib.File tagFile, TreeView searchResults, TreeViewItem Artist, TreeViewItem Album, TreeViewItem Title) 
    { 
     if (searchResults.Items.Count == 0) 
     { 
      searchResults.Items.Add(Artist); 
      Artist.Items.Add(Album); 
      Album.Items.Add(Title); 

     } 
     else 
     { 
      artistFlag = CheckArtist(searchResults, Artist); 
      switch (artistFlag) 
      { 
       case 0: 
        searchResults.Items.Add(Artist); 
       if (Artist.Items.Count == 0) 
       { 
        Artist.Items.Add(Album); 
        Album.Items.Add(Title); 
       } 
       break; 

       case 1: 
        albumFlag = CheckAlbum(Artist, Album); 
        switch (albumFlag) 
        { 
         case 0: 
          Artist.Items.Add(Album); 
         if (Album.Items.Count == 0) 
         { 
          Album.Items.Add(Title); 
         } 
         break; 

         case 1: 
          trackFlag = CheckTitle(Album, Title); 
         break; 

         case 2: 
         break; 
        } 
       break; 

       case 2: 
       break; 
      } 
     } 
    } 

    private int CheckArtist(TreeView searchResults, TreeViewItem Artist) 
    { 
     if (searchResults.Items.Count == 0) 
     { 
      return 0; 
     } 
     else 
     { 
      foreach (TreeViewItem tvi in searchResults.Items) 
      { 
       if (tvi.Header.ToString() != Artist.Header.ToString()) 
       { 
        return 0; 
       } 
       else 
       { 
        return 1; 
       } 
      }    
      return 2; 
     } 
    } 

    private int CheckAlbum(TreeViewItem Artist, TreeViewItem Album) 
    { 
     if (Artist.Items.Count == 0) 
     { 
      return 0; 
     } 
     else 
     { 
      foreach (TreeViewItem tvi in Artist.Items) 
      { 
       if (tvi.Header.ToString() != Album.Header.ToString()) 
       { 
        return 0; 
       } 
       else 
       { 
        return 1; 
       } 
      } 
      return 2; 
     } 
    } 

    private int CheckTitle(TreeViewItem Album, TreeViewItem Title) 
    { 
     if (Album.Items.Count == 0) 
     { 
      return 0; 
     } 
     else 
     { 
      foreach (TreeViewItem tvi in Album.Items) 
      { 
       if (tvi.Header.ToString() != Title.Header.ToString()) 
       { 
        return 0; 
       } 
       else 
       { 
        return 1; 
       } 
      } 
      return 2; 
     } 
    } 

の確認が、再び、どんな助けも大いに感謝されるでしょう:)ありがとう

答えて

1

これは乱雑で間違っているようです私に腹を立てているアプローチでは、CollectionViewsによって最も良く処理されるようにしようとすると、group your itemsに必要なすべての親コンテナを手動で作成する必要がありません。 WPFではUIElementsをコード内で最小限の扱いで扱うだけで、XAMLではtemplatingで処理することができます。したがって、bindすべてTreeViewItemsCollectionViewsに別のプロパティでグループ化することができます。

+0

同意します。 WPFでtreeview +アイテムを直接使用する際の問題は、本当に面倒なことになります。すべてのデータ構造を別の方法で行うのは簡単ですが、アイテムテンプレートと階層データテンプレートを使用して、ツリービューをビューとして取得することもできます。 –

+0

あなたのご意見ありがとうございます、私はそれを試してみましょう:) – Jonathan

関連する問題