2010-10-04 61 views
12

我想使用MVVM设计模式实现我的第一个WPF应用程序。WPF4 Datagrid不在列标题上排序

我创建了一个应用程序,该应用程序绑定到ObservableCollection <>。该应用程序呈现良好,但我希望datagrid重新排序行时,我点击列标题。

我研究过的帖子说: 数据源必须实现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> 

回答

23

问题是这样的代码

<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> 

我希望它可以帮助你!让我知道,如果它不能帮助你,我会尝试后在一些博客我的应用程序(我懒做虽然它!!)

+0

谢谢Guru,这有一点帮助。至少我知道为什么默认排序行为不起作用。我认为这意味着我需要实施自定义排序。我认为我可以通过在DataGrid的排序属性中指定一个处理程序来完成。但我的经理不开火。我期待收到您的代码示例以给我更多指导。 – 2010-10-05 21:30:12

+1

@Paul - 我想你只是缺少一个名为“SortMemberPath”的属性。希望能帮助到你!! – GuruC 2010-10-06 07:28:26

+0

伟大的答案大师!感谢您的帮助!我将通过在DataGridTemplateColumn上指定SortMemberPath =“CustID”(例如)来添加,我可以消除DataGrid上的Sorting属性,并删除我自定义的IComparer实现。我的答案帮助别人。如果有人对解决方案有疑问,我会尽力帮助他们。 – 2010-10-06 14:14:57

0

试试这个:SortMemberPath =“完成”

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

您的答案与接受的答案有何不同? SortMemberPath的值应该命名数据源的一列。 “完成”不是我的成员专栏之一。 – 2013-10-25 18:22:41

+0

我没有看到上面的答案,可能是他/她在编辑我的时候发布的。关于标题名称,我尝试了我的wpf测试,如果它工作,你只需要改变标题名称。 – Doro 2013-10-25 19:10:16