2011-02-21 1 views
0

私はこれをしばらく理解しようとしていますが、実際に解決策を見つけるための正しい用語が不足していると推測しています。だからこれが重複している場合は私を許してください、しかし私は無駄なく検索しました。Dictionaryに格納されている列の値にDataGridを並べ替えます

私は他のアイテムを保持するための辞書を持っているアイテムのコレクションを持っています。辞書は文字列とオブジェクトのペアで、これを使って私が作ったクラスのインスタンスを保持しています。私は以下の簡単なサンプルを作成しました。

public MainPage() 
{ 
    InitializeComponent(); 
    List<Holder> holders = new List<Holder>() 
    { 
     new Holder() 
     { 
      Attributes = new Dictionary<string,object>() 
      { 
       { 
        "TestKey1", new ComplexItem() 
        { 
         a = 15 
        } 
       } 
      }, 
      ComplexItemExample = new ComplexItem() 
      { 
       a = 99 
      }, 
      ComplexListExample = new List<ComplexItem>() 
      { 
       { 
        new ComplexItem() 
        { 
         a = 12 
        }       
       } 
      } 
     }, 
     new Holder() 
     { 
      Attributes = new Dictionary<string,object>() 
      { 
       { 
        "TestKey1", new ComplexItem() 
        { 
         a = 10 
        } 
        } 
      }, 
      ComplexItemExample = new ComplexItem() 
      { 
       a = 12 
      }, 
      ComplexListExample = new List<ComplexItem>() 
      { 
      { 
       new ComplexItem() 
       { 
        a = 22 
       }       
       } 
      } 
     } 
    }; 
    sampleDataGrid.Columns.Add(new DataGridTextColumn() { Binding = new Binding("Attributes[TestKey1].a"), CanUserSort = true, Header = "Dictionary Bound", SortMemberPath = "Attributes[TestKey1].a" }); 
    sampleDataGrid.Columns.Add(new DataGridTextColumn() { Binding = new Binding("ComplexItemExample.a"), CanUserSort = true, Header = "Item Bound", SortMemberPath = "ComplexItemExample.a" }); 
    sampleDataGrid.Columns.Add(new DataGridTextColumn() { Binding = new Binding("ComplexListExample[0].a"), CanUserSort = true, Header = "List Bound", SortMemberPath = "ComplexListExample[0].a" }); 
    sampleDataGrid.ItemsSource = holders; 
} 

次に、簡略化したクラス定義を示します。

public class ComplexItem 
{ 
    public int a { get; set; } 
    public int b { get; set; } 
    public int c { get; set; } 
} 

public class Holder 
{ 
    public Dictionary<string, object> Attributes { get; set; } 
    public List<ComplexItem> ComplexListExample { get; set; } 
    public ComplexItem ComplexItemExample { get; set; } 
} 

そして、この例では、XAMLは以下のとおりです。

<Grid x:Name="LayoutRoot" Background="White"> 
    <sdk:DataGrid AutoGenerateColumns="False" Name="sampleDataGrid" /> 
</Grid> 

これで、列を並べ替えるときに問題が発生しました。何も起こりません。 SortMemberPathは辞書と正しく解決されていないものと思っていますが、これを解決するために紛失しています。助けや洞察力があれば大いに感謝します。

更新07-28-11:
ちょうどデータグリッドは、タイプリスト、辞書に載っていないのである所有者にバインドされていることを明確にします。実際の行は、問題なく解決されているディクショナリを経由してパスが設定されています。 SortMemberPathは同じものに設定されているのではなく、役に立たないものではありません。

答えて

0

これはまだ解決されていなかったことを覚えていましたが、問題の原因を発見しました。だからうまくいけば、これは他の誰かがこの問題にぶつかるのを助けるだろう。ディクショナリの値型をComplexItemに明示的に設定すると、実際には期待どおりに機能します。オブジェクト型を使用すると、実際にはバインディングが設定されません(これは実行時エラーを回避するためのものです)。私はこの辞書が存在していたコードにアクセスすることができず、同じデータを回避策として別のコレクションに格納しなければなりませんでした。

0

基本的な問題は、辞書にバインドしているため、値を比較できないためにDataGridが並べ替える方法がないことです(IComparable)。

独自のカスタムデータオブジェクトを作成し、Equals()& GetHasCode()をオーバーライドして、フレームワークがデータ値の自動比較を行うことができます。

これはどちらか、またはあなたの別のオプションは、コードの背後にあるシーンの背後でこれをソートするために、データグリッド内の何らかのイベントにフックすることです。しかし、実際には...私は、その時点でフレームワークと戦っていること、そしてそれがうまくいくことを意味するので、従来のASP.NETに戻すこともできます。

+0

私はHolderクラスを変更するアクセス権がありません。私はいくつかの情報で質問を更新します。私はどのように私は辞書にバインドしているかわかりません。私は辞書に保持されているアイテム(int a)にバインドしています(私は願っています)。私は、項目がリスト(このdoeはIComparableを実装していない)に保持されている同様のケースに対してsortが動作する例にさらに多くを追加しました。 – Daynew

関連する問題