naa*_*cal 5 .net c# vb.net silverlight wpf
具有以下属性的 ListView(或 ListBox):
<ListView SelectionMode="Single">
<sys:String>James</sys:String>
<sys:String>Claude</sys:String>
<sys:String>Justing</sys:String>
<sys:String>James</sys:String>
</ListView>
Run Code Online (Sandbox Code Playgroud)
如果我单击“James”,将导致同时选择两个项目,即使我选择了 SelectionMode="Single"。当我使用带有字符串属性的帮助器类在 ListView 中显示时,甚至会有相同的行为。看起来 ListView 正在评估项目并选择那些 Equal() 而不是 ReferenceEqual() 的项目。有没有办法改变这种行为,以便 ListView 单独处理每个项目?
问题确实是Equals()vs ReferenceEquals()。
当我使用带有字符串属性的帮助器类在 ListView 中显示时,甚至会有相同的行为。
不完全的。如果您使用匿名帮助器类,您会得到相同的行为。
为什么在字符串周围包装匿名类型不能解决问题?如此处所述,当您创建匿名类型时,编译器会创建一个泛型Equals()方法,true如果对象属于相同(匿名)类型并且它们的属性具有相同的值,则该方法会返回。
解决方案是实现一个真正的(非匿名)类 - 它可以像这样简单:
public class Item
{
public string Display { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
Object.Equals()进行参考比较,因此只要您不覆盖它,您就会得到您期望的行为。
我怀疑该控件的设计假设您不会使用它来显示包含两个相同项目的列表。
至于为什么它使用Equals而不是ReferenceEquals,我怀疑底层设计选择与控件必须能够显示值类型这一事实有关。ReferenceEquals框值类型,结果ReferenceEquals(1,1)返回 false。
| 归档时间: |
|
| 查看次数: |
1391 次 |
| 最近记录: |