Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/300.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 更改列表框的比较器_C#_Wpf_Listbox_Compare_Icomparer - Fatal编程技术网

C# 更改列表框的比较器

C# 更改列表框的比较器,c#,wpf,listbox,compare,icomparer,C#,Wpf,Listbox,Compare,Icomparer,我有一个包含工作项列表的列表框(来自TFS)。我想添加要选择的项目,但无法将这些项目标识为相同的项目 这是我的密码 public void SelectQueryResultItem(WorkItem item) { lstQueryResults.SelectedItems.Add(item); } 当传入的工作项来自SelectedItems列表中的同一查询时,这非常有效。但是,如果它来自不同的查询(即对象引用不同),则它无法正确识别对象 我认为这是

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

这是我的密码

    public void SelectQueryResultItem(WorkItem item)
    {
        lstQueryResults.SelectedItems.Add(item);
    }
当传入的工作项来自SelectedItems列表中的同一查询时,这非常有效。但是,如果它来自不同的查询(即对象引用不同),则它无法正确识别对象

我认为这是比较参考。我想覆盖它并在item.Id上进行比较。有办法吗


请注意,我使用的是而不是

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

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


希望这能有所帮助。

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

    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允许我访问比较器,这样我就可以按值进行比较,如果我想这样做而不需要这样做,那就太好了。

唉,WorkItem是一个密封的类。。。我不知道怎么回事。(扩展方法将采用现有方法(如果它已经存在)是否看到我的编辑,似乎此比较器逻辑是由CollectionView完成的,而不是选择器/列表框。要覆盖该行为,您需要提供自己的CollectionView。