使用 IndexOf 时绑定源未设置位置

Bindingsource not setting position when using IndexOf

我有一个绑定到自定义对象列表的绑定源,我有以下方法:

private void SetMyItem(MyItem item)
{
    //Test 1
    if (item != null)
    {
        bsItems.Position = bsItems.List.IndexOf(item);
    }

    //Test 2 
    foreach (var itm in bsItems)
    {
        if (itm.IsEqual(item))
        {
            bsItems.Position = bsItems.List.IndexOf(itm);
            break;
        }
    }
}

列表包含一些项目,其中之一也是传递给方法的参数。

在上面的第一个测试中,我通过获取传递参数的索引来立即设置位置。位置为-1.

为了确保传递的参数等于列表中的项目,我添加了第二个测试。找到了匹配项,但是位置还是-1.

为什么绑定源没有设置正确的位置?

编辑

IsEqual是一种扩展方法,将两个对象序列化为二进制流并进行比较。

编辑 2

IndexOf 正在按预期工作。它返回正确的索引。但是,将 Position 设置为此索引无效。

将您的 foreach 更改为

foreach (var itm in bsItems.List)
{
    if (itm.IsEqual(item))
    {
        bsItems.Position = bsItems.List.IndexOf(itm);
        break;
    }
}

您正在遍历 bsItems,但您正试图在 bsItems.List 中找到对象。它们是不同的。

似乎要正确设置位置的唯一方法是:

bsItems.ResetBindings(false);
bsItems.Position = bsItems.IndexOf(myItem);