2009-03-02 16 views
0

例:WPFリストボックスたListCollectionView匿名型ナビゲーション問題

フレームワーク:WPF ビジュアルコントロール: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(); 
} 

値を変更した場合、データグリッドカーソルが、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を変更しないことがあります。

誰もこの問題を回避する方法を知っていますか?

public class ViewItemHodler 
{ 
    public object ViewItem { get; set; } 
} 

おかげ

答えて

2

CustomSortがあります:データグリッドへの匿名オブジェクトを割り当てる は私が列をオブジェクトのラッパーを作成し、自動生成しなければならないことを意味する、厳密に型指定されたオブジェクトを作成することはできません、必要条件でありますプロパティをDataGridの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がわからないため)。

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