首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何遍历wpf TreeView的项,如果新项不存在和/或作为现有项的子项,则添加新项?

如何遍历wpf TreeView的项,如果新项不存在和/或作为现有项的子项,则添加新项?
EN

Stack Overflow用户
提问于 2011-07-12 06:41:09
回答 1查看 2.8K关注 0票数 0

我正在为我的论文编写一个程序,希望完成后能让你使用标签数据对音乐文件进行排序。目前,我有一个wpf树视图,我想要显示的所有音乐的列表,该程序已找到按Artist>Album>Title排序。我有一个使用taglib#收集的标记文件列表,可以用来为每个曲目创建TreeViewItems,然后可以将它们添加到TreeView中。问题是,我似乎无法避免添加艺术家/专辑的副本,而不是将曲目添加为已添加的艺术家/专辑的子集。我一直在尝试使用foreach遍历项目,如果标题(艺术家姓名)与要添加的新艺术家的标题匹配,则转到专辑并将其添加为当前项目的子项,然后对专辑执行相同的检查并转到曲目标题,依此类推。我一直有点不高兴,因为即使标题完全匹配,它们似乎总是以不匹配的形式返回,因此添加了一个重复的艺术家。

我对TreeViews的使用完全陌生,所以我不确定我是否以最好的方式来做这件事,或者这只是我逻辑上的一个缺陷,所以任何帮助都将不胜感激。

附件是我用来创建和检查项目的代码。

代码语言:javascript
复制
    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的函数

代码语言:javascript
复制
    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/检查重复项的代码

代码语言:javascript
复制
        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;
        }
    }

很抱歉,这篇文章有点长,但再次感谢您的帮助:)谢谢

EN

回答 1

Stack Overflow用户

发布于 2011-07-12 07:16:26

对我来说,这似乎是一种混乱且容易出错的方法,你尝试做的事情听起来最好是由CollectionViews来处理,它允许你在不手动创建所有必要的父容器的情况下进行group your items。在WPF中,你应该只在代码中处理最小程度的UIElements,大多数事情都可以通过templating在XAML中处理。因此,您可以将所有TreeViewItemsbindCollectionViews,每个分组都按另一个属性进行。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6657559

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档