2010-10-04 12 views
12

Próbuję wdrożyć moją pierwszą aplikację WPF przy użyciu wzorca projektowego MVVM.WPF4 Datagrid nie sortuje nagłówków kolumn

I stworzył aplikację, która jest Databinding do ObservableCollection <>. Aplikacja renderuje się dobrze, ale oczekuję, że datagrid ponownie sortuje wiersze po kliknięciu nagłówków kolumn.

Sprawdziłem posty, które powiedziały: Źródło danych musi implementować IEnumerable, moje robi. Potrzebuję ustawić CanUserSortColumns i/lub CanUserSort (w każdej kolumnie), tak zrobiłem. Mogłabym zaimplementować sortowanie niestandardowe, określając funkcję wywołania zwrotnego sortowania.

Żadne z nich nie pomogło. W debugerze moja funkcja _customerGrid_Sorting nigdy nie zostanie wywołana, a kliknięcie nagłówków kolumn nie przyniesie efektu.

Czy brakuje mi czegoś w XAML, który następuje? Czy jest jeszcze inny interfejs, który muszę wdrożyć? Czuję się teraz bardzo zagubiony, więc każda pomoc jest doceniana.

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> 

Odpowiedz

23

Problemem jest to kod

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

Domyślna prace sortowania jak stwierdzono wszędzie tylko dla DataGridTextColumn, DataGridComboBoxColumn itp.

Teraz tutaj siatka nie wie, jak sortować, ponieważ zdefiniowałeś DataTemplate i etykietę wewnątrz niego. Niektóre osoby mogły zdefiniować SstackTemplate itp. Wewnątrz DataTemplate. Tak DataGrid nie będzie wiedział, jak to posortować.

Postaram się opublikować próbny kod już wkrótce, co możemy zrobić dla takiej DataGridTemplateColumn. Ale miej nadzieję, że kierunek, który ci dałem, pomaga!


Wydaje się, że odpowiedź jest bardzo prosta. Próbowałem go z DataGrid próbki przy użyciu MVVM ale moje rozwiązanie powinno działać dla ciebie czuję

Wszystko jest w porządku w poniżej DataGridTemplateColumn ale brakuje bardzo ważny atrybut o nazwie SortMemberPath. WPW powinien wiedzieć, którą właściwość powinien sortować.

Oryginalnym którym pisał wygląda następująco

<DataGridTemplateColumn Header="Name" MinWidth="300" CanUserSort="True" Width="*"> 
       <DataGridTemplateColumn.CellTemplate> 
        <DataTemplate> 
         <Label Content="{Binding Path=Name}" /> 
        </DataTemplate> 
       </DataGridTemplateColumn.CellTemplate> 
    </DataGridTemplateColumn> 


nie wiem swoich struktur danych. Ale zmodyfikowany powinien wyglądać tak, jak to, co mam nadzieję, pomaga !! Daj mi znać, jeśli to nie pomoże, postaram się pisać mój wniosek w jakimś blogu (jestem leniwy, aby to zrobić, choć !!)

+0

Dzięki Guru, który pomaga trochę. Przynajmniej wiem, dlaczego domyślne zachowanie sortowania nie działa.Rozumiem, że oznacza to konieczność zaimplementowania niestandardowego sortowania. Które myślałem, że mogę zrobić, określając handler w atrybucie Sortowanie DataGrid. Ale mój przewodnik nie strzela. Czekam z niecierpliwością na otrzymanie próbki kodu, aby dać mi więcej wskazówek. –

+1

@Paul - Myślę, że po prostu brakowało Ci atrybutu o nazwie "SortMemberPath". Mam nadzieję, że to pomoże!! – GuruC

+0

Świetna odpowiedź Guru! Dziękuję za pomoc! Dodam, że poprzez określenie SortMemberPath = "CustID" (na przykład) na DataGridTemplateColumn, byłem w stanie wyeliminować atrybut Sorting w DataGrid i usunąć moją niestandardową implementację IComparer. Ja twoja odpowiedź pomaga innym. Jeśli ktoś ma pytania dotyczące rozwiązania, spróbuję im pomóc. –

0

Spróbuj tego: 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> 
+0

Jaka jest twoja odpowiedź inna niż zaakceptowana odpowiedź? Wartość SortMemberPath powinna określać kolumnę źródła danych. "Complete" nie jest jedną z moich kolumn członkowskich. –

+0

Nie widziałem powyższej odpowiedzi, może ją opublikować podczas redagowania mojej. Jeśli chodzi o nazwę nagłówka, wypróbowałem go w moim teście wpf, jeśli to działa, wystarczy zmienić nazwę nagłówka. – Doro

Powiązane problemy