0

問題の例:

フレームワーク: 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; }
}

ありがとう

4

1 に答える 1

2

DataGrid には CustomSort プロパティがあり、IComparer<T>これを実装に設定すると、匿名型のカスタム ソート順を実装できます。CustomSort プロパティの詳細については、次を参照してください。

http://blogs.msdn.com/jgoldb/archive/2008/08/26/improving-microsoft-datagrid-ctp-sorting-performance.aspx

あなたがやりたいことは、Comparer<T>デリゲートを取り、それを の実装で呼び出すシェル クラスを実際に作成することですIComparer<T>.Compare

このようにして、匿名型を作成するコードで var を使用してインスタンスを宣言できます (T が何であるかがわからないため)。

匿名型にバインドされていて、厳密に型指定されたオブジェクトを作成できないという考えは、少しばかげています。コンパイル時に不明なソースから匿名クエリを作成していないため、匿名型に対する制限の理由がわかりません。

于 2009-03-02T18:28:32.697 に答える