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

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

Я совершенно новичок в использовании 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 Ответ

1 голос
/ 12 июля 2011

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

...