0

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

这是我的代码

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

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

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

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

4

2 回答 2

1

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

编辑我挖得更深一点,发现您可以从 CollectionView (它是要在 WPF 中绑定的集合的包装器)派生并覆盖其 Comparer 属性以返回自定义 IComparer。因此,您可以创建类似 WorkItemCollectionView 的东西,它会覆盖 Comparer 并返回类似 WorkItemIDComparer 的东西。

希望这可以帮助。

于 2009-12-01T19:22:04.710 回答
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 允许我访问比较器,那就太好了,这样我就可以按值比较,如果我想而不需要这样做。

于 2009-12-01T19:49:45.063 回答