WPF Datagrid对具有空元素的列进行排序
Posted
技术标签:
【中文标题】WPF Datagrid对具有空元素的列进行排序【英文标题】:WPF Datagrid sort on column with null elements 【发布时间】:2010-12-11 09:01:45 【问题描述】:我有一个 WPF 数据网格,它与许多列一起使用。其中一列的某些元素有时为空,当我尝试对此列进行排序时,这会导致异常。
列的定义类似于:
<dg:DataGrid.Columns>
<dg:DataGridTextColumn Binding="Binding MyObject.Field1" Header="Field1" Width="Auto" />
<dg:DataGridTextColumn Binding="Binding MyObject.Field2.SubField" Header="Field2" Width="Auto" />
</dg:DataGrid.Columns>
如果我在 Field1 列上排序很好,如果我在 Field2 列上排序并且没有空 Field2 对象很好,但有时有并且 DataGrid 尝试在子字段上排序(我猜)并点击空异常:
System.InvalidOperationException was unhandled
Message=The SortDescriptions added are not valid. The probable solutions are to set the CanUserSort on the Column to false, or to use SortMemberPath property on the Column, or to handle the Sorting event on DataGrid.
我尝试将 SortMemberPath 设置为“MyObject.Field2.SubField”,但当然这并不能解决问题,因为 Field2 有时仍为空。我想知道尝试使用我设置 SortMemberPath 的转换器并让该转换器为任何空元素返回 string.empty 但无法使其工作。
我还尝试在这些列的绑定中添加“TargetNullValue=x:Static sys:String.Empty”,但它仍然不起作用。
任何意见/建议将不胜感激。 谢谢, 会
【问题讨论】:
您可以通过使用转换器确保您的对象永远不会为空,或者在获取数据网格的数据时实例化它(如果它为空)。 【参考方案1】:一般建议是:不要使用 SortMemberPath。不仅仅是因为你刚刚遇到的问题。但也因为它们超慢。
改为使用 ListCollectionView 类的 CustomSort 属性。有关详细信息,请阅读 "Improving Microsoft DataGrid CTP sorting performance" 和 "Improving Microsoft DataGrid CTP sorting performance - Part 2"。尽管它说“提高性能”,但它也显示了如何解决您的问题。
希望这会有所帮助:)。
【讨论】:
感谢 Anvaka,很棒的链接,我已经实现了上面的自定义排序,即使对于我网格中相对适度的数据负载,排序速度也明显更快。唯一的缺点是我现在失去了进行多种排序的能力,因为任何新的自定义排序都会覆盖以前的排序。我现在正试图找到一种方法来做到这一点,可能是一个新问题! 谢谢,这也是我的问题! ***.com/questions/4086234/…以上是关于WPF Datagrid对具有空元素的列进行排序的主要内容,如果未能解决你的问题,请参考以下文章