Подтвердить что ты не робот

WPF4 Datagrid не сортирует заголовки столбцов

Я пытаюсь реализовать свое первое приложение WPF с использованием шаблона проектирования MVVM.

Я создал приложение, которое привязывает данные к 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>
4b9b3361

Ответ 1

Проблема заключается в этом коде

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

Сортировка по умолчанию работает, как указано везде, только для DataGridTextColumn, DataGridComboBoxColumn и т.д.

Теперь здесь сетка не знает, как сортировать, потому что вы определили DataTemplate и ярлык внутри него. Некоторые другие люди могли бы определить SstackTemplate и т.д. Внутри DataTemplate. Поэтому DataGrid не будет знать, как его сортировать.

Я постараюсь выслать вам пример кода очень скоро, как то, что мы можем сделать для такого DataGridTemplateColumn. Но надеюсь, что направление, которое я вам дал, помогает!


Кажется, что ответ очень прост. Я попробовал это с образцом DataGrid с использованием MVVM, но мое решение должно работать для вас, я чувствую

В нижней части DataGridTemplateColumn все в порядке, но вам не хватает очень важного атрибута SortMemberPath. ThW 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>

Надеюсь, это поможет вам! Дайте мне знать, если это вам не поможет, я попытаюсь опубликовать свое приложение в каком-нибудь блоге (я ленив, чтобы сделать это, хотя!)

Ответ 2

Попробуйте следующее: 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>