2010-10-04 57 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