【发布时间】:2009-03-02 17:36:46
【问题描述】:
问题示例:
框架:WPF 可视化控件:来自 CodePlex 的 DataGrid
public Window()
{
InitializeComponent();
var listView = new ListCollectionView(
new[]
{
new
{
Bool = false,
Str = "Value1"
},
new
{
Bool = false,
Str = "Value1"
}
}.ToList());
dataGrid.ItemsSource = listView;
listView.MoveCurrentToFirst();
listView.MoveCurrentToNext();
}
如果更改匿名类型之一的值,DataGrid 光标不会将位置更改为 1:
var listView = new ListCollectionView(
new[]
{
new
{
Bool = false,
Str = "Value1"
},
new
{
Bool = false,
Str = "Value2"
}
}.ToList());
光标工作正常且 SelectedIndex = 1。
我认为这是因为匿名对象覆盖 GetHashCode() 对于匿名对象 GetHashCode:所有字段的总和。如果匿名对象的 2 个不同实例的字段相同,则 GetHashCode() 将为两个实例返回相同的值。
也许 DataGrid 在内部使用 GetHashCode 比较对象并且不会更改 SelectedPosition。
有人知道如何避免这个问题吗? 将匿名对象分配给 DataGrid 是必需的,我无法创建强类型对象,这意味着我必须为对象创建一个包装器并自动生成列:
public class ViewItemHodler
{
public object ViewItem { get; set; }
}
谢谢
【问题讨论】:
标签: wpf datagrid object anonymous