我有一个列表框,其中包含WorkItems列表(来自TFS)。我想添加要选择的项目,但无法将项目识别为相同。
这是我的代码
public void SelectQueryResultItem(WorkItem item)
{
lstQueryResults.SelectedItems.Add(item);
}
当传入的WorkItem来自SelectedItems列表中的同一查询时,这非常有用。但是,如果它来自不同的查询(即对象引用不相同),则它不能正确识别对象。
我认为是在比较参考。我想覆盖它并在item.Id上进行比较。有没有办法做到这一点?
请注意,我使用的是WPF ListBox,而不是WinForms ListBox
答案 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允许我访问比较器,那将是很好的,所以如果我愿意,我可以按值进行比较,而不需要这样做。