更改ListBox的比较器

时间:2009-12-01 19:17:40

标签: c# wpf listbox compare icomparer

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

这是我的代码

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

当传入的WorkItem来自SelectedItems列表中的同一查询时,这非常有用。但是,如果它来自不同的查询(即对象引用不相同),则它不能正确识别对象。

我认为是在比较参考。我想覆盖它并在item.Id上进行比较。有没有办法做到这一点?

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

2 个答案:

答案 0 :(得分:1)

您是否尝试在WorkItem类上重写Equals以通过ID进行比较,而不是从ListBox继承?这并不理想,因为显然具有相同ID的两个实例不一定相等。但我不确定如何使用自定义IComparer来诱导Selector基类。

EDIT 我深入挖掘并发现您可以从CollectionView派生(它是要在WPF中绑定的集合的包装)并覆盖其Comparer属性以返回自定义IComparer。因此,您可以创建类似于WorkItemCollectionView的东西,它覆盖Comparer并返回类似WorkItemIDComparer的内容。

希望这有帮助。

答案 1 :(得分:0)

这是解决此问题的一种非酷炫方式。

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

基本上我正在规避ListBox中的比较系统。

如果WPF允许我访问比较器,那将是很好的,所以如果我愿意,我可以按值进行比较,而不需要这样做。