当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工具包的数据网格。
更奇怪的是,每个选择都附加到SelectedItems属性。因此,如果您更改了10次选择,则在SelectedItems属性中将有10个项目,并将当前选择作为最后一项。
有人可以告诉我为什么会这样吗?这是故意还是错误?对我来说似乎更像是一个错误。
其他人也遇到过这个错误。旧文章,但错误仍然存在: http://cs.blueberryislandmedia.com/blogs/blueberries/archive/2009/04/24/bug-in-wpf-listview-single-selection-mode.aspx
答案 0 :(得分:8)
这很有趣,可能是一个错误。这是一个常见的控制和场景,但我怀疑还有其他事情可能发生。我找到了一个类似于这个问题here的引用。解决问题的建议如下:
如果你正在覆盖Equals 正在显示的对象 ListView,做对了否则, 你会得到各种有趣的 行为...
我想这里的理论是,Equals中的一个错误会抛弃ListView中的逻辑。请确认您没有覆盖Equals并发布结果。如果您不是,并且您在此处未获得任何其他帮助,我建议您将此文件作为Microsoft Connect上的错误提交。
答案 1 :(得分:0)
这是一个老答案,但我认为我会添加自己的经验。
我有一个类似的问题,即使我的ListView的SelectionMode是单一的,也会选择多行。行为是非常零星的,与相关的集合中的项目彼此相等。
我的ListView将ItemsSource绑定到ObservableCollection集合。
我发现这种行为只有在我的收藏中有5000多件物品时才会出现。我通过创建临时集合然后设置绑定集合来解决问题。这将我的ListView上的更新减少到只有一次更新。
也许不是最正确的解决方案,但它适用于我的情况,希望能帮助其他人。
答案 2 :(得分:0)
在这个旧线程中抛出我的想法...我也遇到了这个问题,是的,删除我的自定义Equals和GetHashCode覆盖修复它,但是,与Jerry的回答中的引用不同,我的Equals和GetHashCode覆盖方法确实写得正确。
对我来说,当所选数据发生变化时,问题就出现了。虽然更改在ListView中正确显示,但在此之后仍保持选中状态。
虽然我无法找到一个好的解释,但我的个人推测是ListView中的代码可能假设数据不会改变(或者至少是哈希值)无论数据的值如何,记录都不会改变,当哈希值发生变化时,它不会发现"找到"记录取消选中)。通过删除自定义Equals和GetHashCode,.NET可以回退到更通用的版本,该版本通过引用而不是通过其值来标识对象。
现在,尝试使用DataGrid查看是否适用于我...