对存储在Dictionary中的列值排序DataGrid

时间:2011-02-21 18:16:16

标签: c# silverlight data-binding datagrid dictionary

好的,我一直试图解决这个问题一段时间,我猜我只是缺乏正确的术语来实际找到解决方案。所以请原谅我,如果这是重复的,但我搜索没有任何效果。

我有一个项目集合,其中包含一个字典来保存其他项目。字典是一个字符串 - 对象对,我用它来保存我所创建的类的实例。我在下面创建了一个简化的示例。

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 :(得分:0)

你的基本问题是你绑定到一个字典,并且DataGrid没有办法对它进行排序,因为它无法比较值(IComparable)。

你最好编写自己的自定义数据对象,然后重写Equals()&amp; GetHasCode()使框架可以自动比较数据值。

或者是其他选项,或者你的另一个选择可能是挂钩到datagrid中的某种事件,以便在后面的代码后面对它进行排序。但是真的......我的意思是,在那一点上你真的在与框架作斗争以及它做得如此之好,所以你也可以恢复到经典的ASP.NET。

答案 1 :(得分:0)

我记得这仍然没有得到回答,我确实发现了导致问题的原因。所以希望这会帮助其他人遇到这个问题。事实证明,如果您将字典的值类型显式设置为ComplexItem,它实际上将按预期工作。当您使用对象类型时,它实际上并未设置绑定(我假设这是为了避免运行时错误)。我无权访问此词典所在的代码,并被迫将相同的数据存储在单独的集合中作为解决方法。