問題の例:
フレームワーク: 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; }
}
ありがとう