Пример проблемы:
Платформа: WPF Визуальный контроль: DataGrid из CodePlex
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: сумма всех полей. Если поля одинаковы для двух разных экземпляров анонимных объектов, GetHashCode() вернет одно и то же значение для обоих экземпляров.
Возможно, DataGrid внутренне сравнивает объекты с помощью GetHashCode и не изменяет SelectedPosition.
Кто-нибудь знает, как избежать этой проблемы? Назначение анонимных объектов в DataGrid является обязательным требованием, я не могу создавать строго типизированные объекты, что означает, что мне нужно создать оболочку для объекта и автоматически сгенерировать столбцы:
public class ViewItemHodler
{
public object ViewItem { get; set; }
}
Спасибо