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 不对列标题进行排序的主要内容,如果未能解决你的问题,请参考以下文章