Pau*_*vez 13 sorting wpf datagrid
我正在尝试使用MVVM设计模式实现我的第一个WPF应用程序.
我创建了一个数据绑定到ObservableCollection <>的应用程序.应用程序呈现正常,但我希望数据网格在单击列标题时重新排序行.
我研究过的帖子说:数据源必须实现IEnumerable,我的.我需要设置CanUserSortColumns和/或CanUserSort(在每列上).我可以通过指定Sorting回调函数来实现自定义排序.
这些似乎都没有帮助.在调试器中,我的_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>
Run Code Online (Sandbox Code Playgroud)
Gur*_*ruC 24
问题是这段代码
<DataGridTemplateColumn Header="Cust ID" MinWidth="90" CanUserSort="True" >
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Label Content="{Binding Path=CustID}" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
Run Code Online (Sandbox Code Playgroud)
默认排序的工作原理仅适用于DataGridTextColumn,DataGridComboBoxColumn等.
现在,网格不知道如何排序,因为您已在其中定义了DataTemplate和Label.其他人可能在DataTemplate中定义了SstackTemplate等.因此DataGrid将不知道如何对其进行排序.
我将尽快为您发布示例代码,因为我们可以为此类DataGridTemplateColumn做些什么.但希望我给你的方向有帮助!!
下面的DataGridTemplateColumn中的一切都很好,但是你缺少一个名为SortMemberPath的非常重要的属性.WPF应该知道它应该排序的属性.
你发布的原始版本看起来像这样
<DataGridTemplateColumn Header="Name" MinWidth="300" CanUserSort="True" Width="*">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Label Content="{Binding Path=Name}" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
Run Code Online (Sandbox Code Playgroud)
我不知道你的数据结构.但修改过的应该是这样的
<DataGridTemplateColumn SortMemberPath="Name" Header="Name" MinWidth="300" CanUserSort="True" Width="*">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Label Content="{Binding Path=Name}" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
Run Code Online (Sandbox Code Playgroud)
我希望它可以帮到你!! 让我知道,如果它没有帮助你,我会尝试在一些博客中发布我的应用程序(虽然我很懒!)