ディクショナリに保存されている列値でのDataGridの並べ替え

c# data-binding datagrid dictionary silverlight
ディクショナリに保存されている列値でのDataGridの並べ替え

わかりました、私は今しばらくの間これを理解することを試みていて、実際に解決策を見つけるための正しい用語が不足していると推測しています。 これが重複している場合はご容赦ください。しかし、私は無駄に検索しました。

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

public MainPage()
{
    InitializeComponent();
    List holders = new List()
    {
        new Holder()
        {
            Attributes = new Dictionary()
            {
                {
                    "TestKey1", new ComplexItem()
                    {
                        a = 15
                    }
                }
            },
            ComplexItemExample = new ComplexItem()
            {
                a = 99
            },
            ComplexListExample = new List()
            {
                {
                    new ComplexItem()
                    {
                        a = 12
                    }
                }
            }
        },
        new Holder()
        {
            Attributes = new Dictionary()
            {
                {
                    "TestKey1", new ComplexItem()
                    {
                        a = 10
                    }
                    }
            },
            ComplexItemExample = new ComplexItem()
            {
                a = 12
            },
            ComplexListExample = new List()
            {
            {
                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 Attributes { get; set; }
    public List ComplexListExample { get; set; }
    public ComplexItem ComplexItemExample { get; set; }
}

この例では、XAMLは次のようになります。

列をソートしようとすると問題が発生します。 何も起こりません。 SortMemberPathが辞書で正しく解決されていないことに関係があると思いますが、これを解決するのに途方に暮れています。 任意の助けや洞察力は大歓迎です。

更新07-28-11: +データグリッドが辞書ではなくリスト型のホルダーにバインドされていることを明確にするためだけに。 実際の行には、問題なく解決されているディクショナリを介して設定されたパスがあります。 SortMemberPathが同じものに設定されていませんが、まだ役に立ちません。

  0  0


ベストアンサー

基本的な問題は、ディクショナリにバインドしていることです。値を比較できないため、DataGridでソートする方法はありません(IComparable)。

フレームワークがデータ値の自動比較を行えるように、独自のカスタムデータオブジェクトを記述してからEquals()およびGetHasCode()をオーバーライドする方がはるかに優れています。

それか、他のオプションとして、データグリッド内の何らかのイベントにフックして、コードビハインドでバックグラウンドでこれをソートすることが考えられます。 しかし、本当に… つまり、その時点であなたは本当にフレームワークとそれとうまくやっていることと戦っているので、古典的なASP.NETに戻るだけでもいいのです。

0


さて、これはまだ回答されておらず、問題の原因を発見しました。 うまくいけば、これが他の誰かがこの問題に遭遇するのを助けるでしょう。 ディクショナリの値タイプをComplexItemに明示的に設定すると、実際に期待どおりに機能することがわかりました。 オブジェクトタイプを使用する場合、実際にはバインディングは設定されません(実行時エラーを回避するためだと思います)。 この辞書が存在するコードにはアクセスできず、回避策として同じデータを別のコレクションに保存する必要がありました。

0


タイトルとURLをコピーしました