2009-12-01 74 views
0

将Silverlight DataGrid与IList派生数据源一起使用时,可以单击列进行排序,假定CanUserSortColumns/CanUserSort属性不为false。Datagrid无法在某些字段上进行排序 - 对象,对象子字段,基类型

但是我发现一些边缘案例不能按 - 值显示,但点击列没有效果。

第一个边缘案例似乎是非常简单的List<string>,它显示了值,但不允许排序。这与字符串impliments IComparable没有太大关系。

第二个边缘案例要复杂得多,可能需要解决。第二种情况涉及对象类型的字段和子字段。

public class ContainerItem 
{  
    public object ChildValue {get; set;} 

    // Other properties 
} 

ChildValue的值可以显示在网格中,如果分配给ChildValue类型具有的属性,我们还可以绑定到他们(ChildValue。物业),但我们不能对列进行排序。

很明显,这里缺少定义类型是一个问题 - 如果对象中存在不同的,不兼容的类型,显然会出现问题。在我的具体情况中,我坚持这一点,因为ChildValue是动态分配的,就像列绑定定义一样。我看起来很明显,我需要一个解决方法 - 我有控制ContainerItem类的定义,并且对ChildValue属性的绑定始终是OneWay(只有ContainerItem的固定属性使用双向绑定)。

我可能使用SortMemberPath并将其绑定到ContainerItem的某个数组属性,其中数组的每个元素都是一个ContainerItemComparer对象,该对象充满了列的绑定信息,以便它可以从两个ChildValue属性中提取值,比较它们,并返回结果,而DataGrid没有意识到这些属性是裸露的对象?

回答

1

我认为第一个边缘案例很人造。为什么要将一个字符串列表绑定到一个数据网格?它可能不起作用,因为它没有属性名称用作排序路径。

对于动态排序问题,您可能会更好地在您的集合中实现ICollectionView。然后,您可以手动控制排序,但是您想要处理它,而不要强制它通过内置排序工作。

相关问题