先来看这样演示程序。在修复前,选择重复的数字会导致选中状态混乱,出现多个数字莫名其妙被选中的状况。
刨根问题,此问题最终定位到如下代码(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