WPF4 Datagrid不对列标题进行排序

时间:2010-10-04 22:45:19

标签: wpf sorting datagrid

我正在尝试使用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>

2 个答案:

答案 0 :(得分:24)

问题在于此代码

<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 的非常重要的属性。 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>

我希望它对你有所帮助!!让我知道,如果它没有帮助你,我会尝试在一些博客中发布我的应用程序(虽然我很懒!)

答案 1 :(得分:-1)

试试这个:SortMemberPath =“完成”

<DataGridTemplateColumn Header="CustID" SortMemberPath="Complete" MinWidth="90"      
CanUserSort="True" CanUserResize="True">
    <DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
            <Label Content="{Binding Path=CustID}"/>
        </DataTemplate>
    </DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>