Как вы можете перебирать элементы wpf TreeView, добавляя новые элементы, если они еще не существуют, и / или как дочерние элементы существующих элементов?

Я работаю над программой для моей диссертации, которая, надеюсь, когда она будет закончена, позволит вам сортировать музыкальные файлы, используя данные тегов. На данный момент у меня есть представление в виде дерева wpf, в котором я хочу отобразить список всей музыки, найденной программой, отсортированной по исполнителю> Альбом> Название. У меня есть список файлов тегов, собранных с помощью taglib #, которые я могу использовать для создания TreeViewItems для каждой дорожки и затем добавлять их в TreeView. Проблема в том, что я не могу избежать добавления дубликатов исполнителей / альбомов вместо добавления трека в качестве дочернего элемента уже добавленного исполнителя / альбома. Я пытался использовать foreach для итерации по элементам, и если заголовок (имя исполнителя) совпадает с заголовком нового добавляемого исполнителя, то вместо этого перейдите в альбом и добавьте его как дочерний элемент текущего элемента, затем выполните та же проверка альбомов и переход к названию трека и так далее. У меня было немного радости, хотя, даже если заголовки точно совпадают, они всегда возвращаются как несоответствующие, и, таким образом, добавляется художник-дубликат.

Я совершенно новичок в использовании TreeViews, поэтому я не уверен, что подхожу к этому наилучшим образом, или это просто недостаток в моей логике или что-то еще, поэтому любая помощь будет принята с благодарностью.

К нему прилагается код, который я использую для создания и проверки элементов.

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

Извините, это немного длинный, но, опять же, любая помощь будет принята с благодарностью :) Спасибо


person Jonathan    schedule 11.07.2011    source источник


Ответы (1)


Мне это кажется беспорядочным и подверженным ошибкам подходом. То, что вы пытаетесь сделать, звучит так, как будто с этим лучше всего справится _ 1_, что позволяет группируйте элементы, не создавая вручную все необходимые родительские контейнеры. В WPF вы должны иметь дело с UIElements только в минимальной степени в коде, большинство вещей можно обрабатывать через создание шаблонов в XAML. Таким образом, вы можете привязать все свои TreeViewItems к CollectionViews, группируя каждую по другому свойству. .

person H.B.    schedule 11.07.2011
comment
Соглашаться. Проблема с использованием элементов treeview + непосредственно в WPF заключается в том, что они очень быстро становятся беспорядочными. Было бы проще сделать все ваши структуры данных другим способом, а затем использовать шаблоны элементов и иерархические шаблоны данных, чтобы получить представление в виде дерева в виде представления. - person John Gardner; 12.07.2011
comment
Спасибо за ваш вклад, я попробую :) - person Jonathan; 12.07.2011