2011-07-11 53 views
0

我正在研究我的畢業論文的程序,希望完成後可以使用標記數據對音樂文件進行排序。目前我有一個wpf樹視圖,我想要顯示程序找到的所有音樂列表,按藝術家>專輯>標題排序。我有一個使用taglib#收集的標記文件列表,我可以使用它爲每個軌道創建TreeViewItems,然後將它們添加到TreeView中。問題是,我似乎無法避免添加藝術家/專輯的重複內容,而不是添加曲目作爲已添加的藝術家/專輯的子項。我一直在嘗試使用foreach遍歷項目,並且如果標題(藝術家名稱)與要添加的新藝術家的標題相匹配,則轉而使用專輯並將其添加爲當前項目的子項目,然後執行對專輯進行同樣的檢查並轉到曲目標題等等。儘管標題完全匹配,但我一直沒有什麼喜悅,因爲它們似乎總是返回爲不匹配,因此添加了一個重複的藝術家。如何迭代wpf TreeView的項目,添加新項目(如果它們不存在和/或作爲現有項目的子項)?

我對使用TreeViews完全不熟悉,所以我不確定我是以最好的方式解決這個問題,或者如果它只是我的邏輯或任何幫助的缺陷,將不勝感激。

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; 
    } 

而用於添加到TreeView /檢查重複

 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

相關問題