Сортировка DataGrid по значению столбца, хранящемуся в словаре - PullRequest
0 голосов
/ 21 февраля 2011

Хорошо, я уже некоторое время пытаюсь понять это, и я предполагаю, что мне просто не хватает правильной терминологии, чтобы действительно найти решение. Поэтому, пожалуйста, прости меня, если это дубликат, но я искал безрезультатно.

У меня есть коллекция предметов, в которой есть словарь для хранения других предметов. Словарь представляет собой пару строка-объект, и я использовал это для хранения экземпляра класса, который я создал. Я создал упрощенный образец ниже.

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:
Просто чтобы уточнить, что сетка данных связана с держателями типа List, а не словаря. Реальные строки имеют свои пути, установленные через словарь, который разрешается без каких-либо проблем. Не SortMemberPath настроен на то же самое, но безрезультатно.

Ответы [ 2 ]

0 голосов
/ 03 июля 2012

Ну, я вспомнил, что до сих пор не было ответа, и я обнаружил, что является причиной проблемы. Надеюсь, это поможет кому-то еще столкнуться с этой проблемой. Как выясняется, если вы явно установите тип значения словаря в ComplexItem, он на самом деле будет работать, как и ожидалось. Когда вы используете тип объекта, он фактически не устанавливает привязку (я предполагаю, что это позволяет избежать ошибок во время выполнения). У меня не было доступа к коду, в котором находился этот словарь, и я был вынужден хранить те же данные в отдельной коллекции, что и обходной путь.

0 голосов
/ 25 февраля 2011

Ваша основная проблема в том, что вы привязываетесь к словарю, и DataGrid не может отсортировать его, потому что он не может сравнивать значения (IComparable).

Вам гораздо лучше написать свои собственные объекты данных, а затем переопределить Equals () и GetHasCode (), чтобы платформа могла автоматически сравнивать значения данных.

Это либо это, либо другой вариант - подключиться к какому-либо событию в сетке данных для сортировки этого за кадром в коде позади.Но на самом деле ... Я имею в виду, что в этот момент вы действительно боретесь с фреймворком и тем, что он делает так хорошо, так что вы можете просто вернуться к классическому ASP.NET.

...