WPF4 Datagrid не сортирует заголовки столбцов - PullRequest
13 голосов
/ 05 октября 2010

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

Я создал приложение, которое привязывает данные к ObservableCollection <>.Приложение отрисовывается нормально, но я ожидаю, что сетка данных пересортирует строки, когда я нажму на заголовки столбцов.

Я исследовал сообщения, в которых говорилось: источник данных должен реализовывать IEnumerable, мой делает.Мне нужно установить CanUserSortColumns и / или CanUserSort (на каждый столбец), я сделал.Я мог бы реализовать пользовательскую сортировку, указав функцию обратного вызова Sorting.

Ничто из этого, похоже, не помогло.В отладчике моя функция _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>

Ответы [ 2 ]

24 голосов
/ 05 октября 2010

Проблема в следующем коде

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

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

Теперь здесь таблица не знает, как сортировать, потому что вы определили шаблон данных и метку внутри него.Кто-то другой может определить 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>

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

0 голосов
/ 24 октября 2013

Попробуйте это: 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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...