Jak mogę posortować DataGridTemplateColumn w zestawie narzędzi WPF DataGrid?

93

Mam zestaw narzędzi DataGrid WPF z jednym DataGridTemplateColumn. W atrybucie siatki określiłem, że chcę, aby wszystkie kolumny można było sortować, ale DataGridTemplateColumn na to nie zezwala. Wszystkie inne kolumny umożliwiają sortowanie. Próbowałem nawet jawnie ustawić CanUserSort na true dla tej kolumny, ale bez powodzenia. Czy jest w ogóle możliwe sortowanie kolumny szablonu? Udostępniłem niestandardowy sortownik, który działa dla wszystkich kolumn, ale nagłówek nie pozwala na kliknięcie sortowania.

<Controls:DataGrid ItemsSource="{Binding Events}" AutoGenerateColumns="False" 
                               CanUserSortColumns="True" 
                               CanUserReorderColumns="False" 
                               Sorting="DataGrid_Sorting" 
                               x:Name="EventsGrid">
                <Controls:DataGrid.Columns>
                    <Controls:DataGridTemplateColumn Header="Type" Width="42" CanUserResize="False">
                        <Controls:DataGridTemplateColumn.CellTemplate>
                            <DataTemplate>
                                <Image Source="{Binding EventTypeImage, Mode=OneWay}" HorizontalAlignment="Center" Width="16"/>
                            </DataTemplate>
                        </Controls:DataGridTemplateColumn.CellTemplate>
                    </Controls:DataGridTemplateColumn>
                    <Controls:DataGridTextColumn Header="Source" 
                                           Binding="{Binding Source, Mode=OneWay}" />
                    <Controls:DataGridTextColumn Header="Details" MinWidth="175" 
                                           Binding="{Binding Details, Mode=OneWay}" />
                    <Controls:DataGridTextColumn Header="Timestamp" MinWidth="175"  
                                           Binding="{Binding Timestamp, Mode=OneWay}" 
                                           IsReadOnly="True"/>
                </Controls:DataGrid.Columns>
            </Controls:DataGrid>
Kilhoffer
źródło

Odpowiedzi:

172

Musisz ustawić SortMemberPathwłaściwość na Controls:DataGridTemplateColumnnazwę właściwości CLR, według której chcesz sortować.

Obrabować
źródło
2
Działa świetnie. Dzięki!
Kilhoffer
6
Jedno słowo ostrzeżenia. Nie spowoduje to automatycznego ponownego sortowania, jeśli zmienisz dane bazowe.
Kelly
1
Kolejna uwaga: może to zabrzmieć głupio, ale jeśli twoja kolumna nie ma nagłówka (tytułu), to również nie zadziała - kliknięcie nagłówka uruchamia sortowanie. Mam kolumnę, która nie potrzebowała nagłówka i rozwiązałem to, ustawiając Header = ""
Bokoskokos
Działa zgodnie z oczekiwaniami
Harmi
34

Dodano SortMemberPath="Name"do DataGridTemplateColumn. Zaczęło się sortować.

<data:DataGridTemplateColumn Header="Name" SortMemberPath="Name" CanUserSort="True">
ferrell
źródło
15
 <DataGridTemplateColumn SortMemberPath="DataDiNascita" Header="Data di nascita" IsReadOnly="True">
                <DataGridTemplateColumn.CellEditingTemplate>
                    <DataTemplate>
                        <DatePicker SelectedDate="{Binding Path=DataDiNascita}"></DatePicker>
                    </DataTemplate>
                </DataGridTemplateColumn.CellEditingTemplate>
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <TextBlock Text="{Binding Path=DataDiNascita,StringFormat=\{0:dd/MM/yyyy\}}"></TextBlock>
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>
daniele3004
źródło