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