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