我正在研究我的畢業論文的程序,希望完成後可以使用標記數據對音樂文件進行排序。目前我有一個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;
}
}
對不起代碼的功能,這是一個位一個漫長的,但是再次,任何幫助將不勝感激:)謝謝
同意。直接在WPF中使用treeview +項目的問題是,它實際上很快就會變得混亂。以另一種方式完成所有數據結構會更容易,然後使用項目模板和平行數據模板將樹視圖作爲視圖。 –
感謝您的輸入,我會試一試:) – Jonathan