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 替换基础集合时,我的 DataGrid 停止排序。

以上是关于WPF4 Datagrid 不对列标题进行排序的主要内容,如果未能解决你的问题,请参考以下文章

合并标题列datagrid wpf

如何以编程方式对 Material UI DataGrid 列进行排序?

WPF Datagrid对具有空元素的列进行排序

如何在 AS3 中对 datagrid 列进行排序?

使用 C# 在 WPF 中使 DataGrid 列标题可排序

在 WPF 中对 DataGrid 进行预排序