代码之家  ›  专栏  ›  技术社区  ›  Yogesh

WPF ListView/GridView单一选择错误

  •  2
  • Yogesh  · 技术社区  · 15 年前

    当selectionmode设置为single时,WPF中的listview/gridview中存在一个奇怪的错误。

    复制方法:

    生成集合(集合必须具有足够的项,以便ListView至少可以滚动2-3页):

    var customers = from c in _db.Customers
        orderby c.Name, c.City
         select c;
    

    将集合绑定到ListView:

    dataGrid.ItemsSource = customers.ToList();
    

    在第一页,更改所选内容3-4项。记住您以前选择的项目。使用鼠标滚轮向下滚动,以便进入下一页。向上滚动。哇!!您将看到您单击选中的所有项目?! 此错误的图像: http://img261.imageshack.us/img261/133/listview.jpg

    同样的问题也困扰着WPF工具箱的DataGrid。

    更奇怪的是,每个选择都附加到SelectedItems属性。因此,如果更改选择10次,则SelectedItems属性中将有10个项目,其中当前选择作为最后一个项目。

    有人能告诉我为什么会这样吗?这是有意的还是一个错误?在我看来更像个虫子。

    其他人也遇到了这个错误。旧文章,但问题仍然存在: http://cs.blueberryislandmedia.com/blogs/blueberries/archive/2009/04/24/bug-in-wpf-listview-single-selection-mode.aspx

    3 回复  |  直到 11 年前
        1
  •  8
  •   Jerry Bullard    15 年前

    这很有趣,可能是一个bug。不过,这是一个很常见的控制和场景,我怀疑可能会发生其他事情。我发现了一个与这个问题类似的参考。 here . 为解决这一问题提供的建议如下:

    如果您在 显示在 listview,否则就做对了, 你会很有趣的 行为…

    我想这里的理论是,Equals中的bug会以某种方式抛出ListView中的逻辑。请确认您没有重写equals并发布您的结果。如果您没有,并且您在这里没有任何其他帮助,我建议您将此作为Bug归档 Microsoft Connect .

        2
  •  0
  •   FodderZone    11 年前

    这是一个有答案的旧线索,但我想我会添加我自己的经验。

    我有一个类似的问题,多行被选中,即使我的ListView的SelectionMode是单行的。这种行为非常零星,而且 不是 与集合中彼此相等的项相关。

    我的ListView已将itemsource绑定到ObservableCollection集合。

    我发现只有当我的收藏中有超过5000件物品时,这种行为才会出现。我通过创建临时集合,然后设置绑定集合来解决此问题。这将我的ListView上的更新减少到只有一个更新。

    也许不是最正确的解决方案,但它在我的案例中起作用,希望能帮助其他人。

        3
  •  0
  •   Jim    11 年前

    把我的想法抛到这根旧线上…我也遇到了这个问题,是的,删除了我的自定义equals和gethashcode覆盖修复了它,但是,与Jerry答案中的引用不同,我的equals和gethashcode覆盖方法确实是正确编写的。

    对我来说,当选择的数据被更改时,问题就表现出来了。当更改在ListView中正确显示时,它仍然处于选中状态。

    虽然我找不到一个好的解释,我的 个人猜测 是ListView中的代码可能假定数据不会更改(或者至少记录的哈希值不会更改,这取决于数据的值),并且当哈希值更改时,它无法“找到”记录来取消选择它。通过删除自定义的equals和gethashcode,.net返回到一个更通用的版本,该版本通过对象的引用而不是其值来标识对象。

    现在,继续尝试一个数据报,看看它是否对我有效…