好的,我一直试图解决这个问题一段时间,我猜我只是缺乏正确的术语来实际找到解决方案。所以请原谅我,如果这是重复的,但我搜索没有任何效果。
我有一个项目集合,其中包含一个字典来保存其他项目。字典是一个字符串 - 对象对,我用它来保存我所创建的类的实例。我在下面创建了一个简化的示例。
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设置为相同的东西,但无济于事。
答案 0 :(得分:0)
你的基本问题是你绑定到一个字典,并且DataGrid没有办法对它进行排序,因为它无法比较值(IComparable)。
你最好编写自己的自定义数据对象,然后重写Equals()&amp; GetHasCode()使框架可以自动比较数据值。
或者是其他选项,或者你的另一个选择可能是挂钩到datagrid中的某种事件,以便在后面的代码后面对它进行排序。但是真的......我的意思是,在那一点上你真的在与框架作斗争以及它做得如此之好,所以你也可以恢复到经典的ASP.NET。
答案 1 :(得分:0)
我记得这仍然没有得到回答,我确实发现了导致问题的原因。所以希望这会帮助其他人遇到这个问题。事实证明,如果您将字典的值类型显式设置为ComplexItem,它实际上将按预期工作。当您使用对象类型时,它实际上并未设置绑定(我假设这是为了避免运行时错误)。我无权访问此词典所在的代码,并被迫将相同的数据存储在单独的集合中作为解决方法。