代码之家  ›  专栏  ›  技术社区  ›  Vaccano

更改列表框的比较器

  •  0
  • Vaccano  · 技术社区  · 15 年前

    我有一个列表框,其中包含工作项列表(来自TFS)。我想添加要选择的项目,但无法识别相同的项目。

    这是我的密码

        public void SelectQueryResultItem(WorkItem item)
        {
            lstQueryResults.SelectedItems.Add(item);
        }
    

    当传入的工作项来自selecteditems列表中的同一查询时,此功能非常有用。但是,如果它来自不同的查询(即对象引用不同),那么它就不能正确地标识对象。

    我想这是比较参考。我想重写它并在item.id上进行比较。有什么方法可以这样做吗?

    请注意,我正在使用 WPF ListBox 而不是 WinForms ListBox

    2 回复  |  直到 11 年前
        1
  •  1
  •   Josh    15 年前

    不是从ListBox继承,而是尝试重写WorkItem类上的Equals以按ID进行比较吗?这并不理想,因为显然两个具有相同ID的实例不一定相等。但我不确定如何哄选择器基类使用自定义IComparer。

    编辑 我更深入地研究了一下,发现您可以从CollectionView派生(它是集合的包装器,将在WPF中绑定),并重写其Comparer属性以返回自定义IComparer。因此,您可以创建一个类似WorkItemCollectionView的视图来覆盖比较器,并返回类似WorkItemIdComparer的内容。

    希望这有帮助。

        2
  •  0
  •   Vaccano    15 年前

    这里有一个非酷的方法来解决这个问题。

        public void SelectQueryResultItem(WorkItem item)
        {
            // Because the ListBox only compares by reference, 
            //  we need to find the matching WorkItem (if any)
            //  before adding it to the selected list.
            WorkItem matchingWorkItemInList = GetWorkItemInQueryResultByID(item.Id);
            if (matchingWorkItemInList != null)
                lstQueryResults.SelectedItems.Add(matchingWorkItemInList);
        }
    
        public WorkItem GetWorkItemInQueryResultListByID(int Id)
        {
            foreach (WorkItem workItem in lstQueryResults.Items)
            {
                if (workItem.Id == Id)
                {
                    return workItem;
                }
            }
            return null;
        }
    

    基本上,我绕过了列表框中的比较系统。

    如果wpf允许我访问比较器,这样我就可以根据值进行比较,如果我想并且不需要这样做的话。