WPF4 Datagrid 不对列标题进行排序
Posted
技术标签:
【中文标题】WPF4 Datagrid 不对列标题进行排序【英文标题】:WPF4 Datagrid doesn't sort on column headers 【发布时间】:2011-04-21 01:22:19 【问题描述】:我正在尝试使用 MVVM 设计模式实现我的第一个 WPF 应用程序。
我创建了一个数据绑定到 ObservableCollection 的应用程序。应用程序呈现良好,但我希望数据网格在单击列标题时重新排序行。
我研究过这样的帖子: 数据源必须实现 IEnumerable,我的确实如此。 我需要设置 CanUserSortColumns 和/或 CanUserSort(在每一列上),我做到了。 我可以通过指定排序回调函数来实现自定义排序,我做到了。
这些似乎都没有帮助。在调试器中,我的 _customerGrid_Sorting 函数永远不会被调用,并且单击列标题没有任何效果。
我是否遗漏了后面的 XAML 中的某些内容?我需要实现另一个接口吗?我现在感觉很失落,所以非常感谢任何帮助。
XAML:
<DataGrid Name="_customerGrid"
AutoGenerateColumns="False"
CanUserSortColumns="True"
ColumnHeaderStyle="StaticResource columnHeaderStyle"
HorizontalAlignment="Left"
ItemsSource="Binding Path=AllCustomers"
RowDetailsVisibilityMode="VisibleWhenSelected"
RowStyle="StaticResource DataGridRowStyle"
SelectionUnit="FullRow"
Sorting="_customerGrid_Sorting"
VerticalAlignment="Top">
<DataGrid.Columns>
<DataGridTemplateColumn Header="Cust ID" MinWidth="90" CanUserSort="True" >
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Label Content="Binding Path=CustID" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTemplateColumn Header="Name" MinWidth="300" CanUserSort="True" Width="*">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Label Content="Binding Path=Name" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
【问题讨论】:
【参考方案1】:试试这个:SortMemberPath="Complete"
<DataGridTemplateColumn Header="CustID" SortMemberPath="Complete" MinWidth="90"
CanUserSort="True" CanUserResize="True">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Label Content="Binding Path=CustID"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
【讨论】:
您的答案与接受的答案有何不同? SortMemberPath 的值应该命名数据源的列。 “完成”不是我的成员专栏之一。 我没有看到上面的答案,可能是他/她在我编辑我的时候发布的。关于标题名称,我尝试了我的 wpf 测试,如果它有效,您只需更改标题名称。【参考方案2】:问题是这段代码
<DataGridTemplateColumn Header="Cust ID" MinWidth="90" CanUserSort="True" >
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Label Content="Binding Path=CustID" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
默认排序仅适用于 DataGridTextColumn、DataGridComboBoxColumn 等。 现在这里的网格不知道如何排序,因为您在其中定义了一个 DataTemplate 和一个 Label。其他人可能在 DataTemplate 中定义了 SstackTemplate 等。因此 DataGrid 将不知道如何对其进行排序。
我会尽快向您发布示例代码,以便我们可以为此类 DataGridTemplateColumn 做些什么。但希望我给你的方向对你有帮助!!
看来答案很简单。我使用 MVVM 使用示例 DataGrid 进行了尝试,但我觉得我的解决方案应该适合你
下面的 DataGridTemplateColumn 一切正常,但您缺少一个非常重要的属性,称为 SortMemberPath。 Thw WPF 应该知道它应该对哪个属性进行排序。
你发的原帖是这样的
<DataGridTemplateColumn Header="Name" MinWidth="300" CanUserSort="True" Width="*">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Label Content="Binding Path=Name" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
我不知道你的数据结构。但是修改后的应该是这样的
<DataGridTemplateColumn SortMemberPath="Name" Header="Name" MinWidth="300" CanUserSort="True" Width="*">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Label Content="Binding Path=Name" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
希望对你有帮助!!如果对您没有帮助,请告诉我,我会尝试在某个博客中发布我的应用程序(虽然我很懒惰!)
【讨论】:
谢谢大师,这有点帮助。至少我知道为什么默认的排序行为不起作用。我认为这意味着我需要实现自定义排序。我认为我可以通过在 DataGrid 的 Sorting 属性中指定一个处理程序来做到这一点。但是我的处理程序没有开火。我期待收到您的代码示例,为我提供更多指导。 @Paul - 我认为您只是缺少一个名为“SortMemberPath”的属性。希望有帮助!! 伟大的答案大师!谢谢您的帮助!我将通过在 DataGridTemplateColumn 上指定 SortMemberPath="CustID"(例如)添加这一点,我能够消除 DataGrid 上的 Sorting 属性并删除我的 IComparer 自定义实现。我你的回答可以帮助别人。如果有人对解决方案有疑问,我会尽力帮助他们。 谢谢!为我节省了很多时间。我必须为需要文本换行的行实现 CellTemplates,实际上我认为您无法对这些列进行排序,但现在我知道您可以! 我有类似的问题,但是当我用 BindingList以上是关于WPF4 Datagrid 不对列标题进行排序的主要内容,如果未能解决你的问题,请参考以下文章
如何以编程方式对 Material UI DataGrid 列进行排序?