先来看这样演示程序。在修复前,选择重复的数字会导致选中状态混乱,出现多个数字莫名其妙被选中的状况。
刨根问题,此问题最终定位到如下代码(WPF 项目,Silverlight项目类似):
07 | internal bool Select( object o, bool assumeInItemsCollection) |
09 | if (!Selector.ItemGetIsSelectable(o)) return false ; |
10 | if (!assumeInItemsCollection && ! this ._owner.Items.Contains(o)) |
12 | if (! this ._toDeferSelect.Contains(o)) this ._toDeferSelect.Add(o); |
15 | if (! this ._toUnselect.Remove(o)) |
17 | if ( this ._owner._selectedItems.Contains(o)) return false ; |
18 | if ( this ._toSelect.Contains(o)) return false ; |
19 | if (! this ._owner.CanSelectMultiple && this ._toSelect.Count > 0) |
21 | foreach ( object obj2 in (IEnumerable) this ._toSelect) |
23 | this ._owner.ItemSetIsSelected(obj2, false ); |
25 | this ._toSelect.Clear(); |
27 | this ._toSelect.Add(o); |
由于使用的是Items.Contains(o)判断,所以会导致值类型的重复数据判断出错。当然修复此问题的思想就是把值类型转换为引用类型。
创建如下代码
01 | public class WrapObject<T> |
05 | public WrapObject(T o) |
10 | public static implicit operator WrapObject<T>(T o) |
12 | return new WrapObject<T>(o); |
15 | public static explicit operator T(WrapObject<T> o) |
25 | public override string ToString() |
27 | return _obj == null ? null : _obj.ToString(); |
绑定方法修改为
listBox2.ItemsSource = new WrapObject< int >[] { 1, 2, 3, 4, 5, 6, 1, 4, 5, 2, 3, 6 }; |
此问题到此解决
本文来自Aimeast的博客,原文地址:http://www.cnblogs.com/Aimeast/archive/2011/05/11/2043281.html