前段时间在写 silverlight 程序时,有位小伙子绑定的datagrid,出现其中一行不能被选中的情况,当点击此行时,会选中另外的行.
后来跟踪发现,这位同事写的类中,override 了 Equals() 方法,并且是确定对象的一个ID属性,如果二个对象的ID相等,则返回真.
而 SL 的 DataGrid 在加载数据时,会检查数据的相等性,即调用 Equals()方法对比.就导致上面所说的问题.
还有就是,如果同一个对象在集合中增加了二次,也会出现如上问题,因为本身就是同一个对象了.
测试代码看起来如下:
private void TestDataGrid()
{
//ObservableCollection<KtwlSerializeClass> list = new ObservableCollection<KtwlSerializeClass>();
List<KtwlSerializeClass> list = new List<KtwlSerializeClass>();
KtwlSerializeClass c = new KtwlSerializeClass("初审");
c.Property1 = "aaa";
c.Property2 = 1;
list.Add(c);
c = new KtwlSerializeClass("复审");
c.Property1 = "aaa";
c.Property2 = 1;
list.Add(c);
c = new KtwlSerializeClass("复审");
c.Property1 = "aaa";
c.Property2 = 1;
list.Add(c);
//c.Property2 = 33;
// 再增加相同对象,则此行不能被选中
//list.Add(c);
//list.Add(c);
c = new KtwlSerializeClass("初审");
c.Property1 = "aaa";
c.Property2 = 1;
list.Add(c);
GrdTest.ItemsSource = list;
(new TestChildWindow(list)).Show();
}
private void Button_Click(object sender,RoutedEventArgs e)
{
TestDataGrid();
}
}
public class KtwlSerializeClass
{
public KtwlSerializeClass(string name)
{
this.Name = name;
}
public string Property1 { get; set; }
public int Property2 { get; set; }
public string Name { get; set; }
public override bool Equals(object obj) { if (this == obj) return true; if (obj == null) return false; if (!(obj is KtwlSerializeClass)) return false; if (((KtwlSerializeClass)obj).Name == this.Name) return true; else return false; } }
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。