Nano Hash - криптовалюты, майнинг, программирование

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

Я пытаюсь реализовать свое первое приложение 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>
04.10.2010

Ответы:


1

Проблема в этом коде

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

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

Теперь здесь сетка не умеет сортировать, потому что вы определили DataTemplate и Label внутри нее. Кто-то другой мог определить SstackTemplate и т. Д. Внутри DataTemplate. Таким образом, DataGrid не будет знать, как это отсортировать.

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


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

В приведенном ниже столбце 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>

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

05.10.2010
  • Спасибо, Гуру, это немного помогает. По крайней мере, я знаю, почему поведение сортировки по умолчанию не работает. Я так понимаю, что мне нужно реализовать настраиваемую сортировку. Я думал, что смогу сделать, указав обработчик в атрибуте Sorting DataGrid. Но мой куратор не стреляет. Я с нетерпением жду вашего примера кода, чтобы дать мне больше указаний. 06.10.2010
  • @Paul - я думаю, вам просто не хватало атрибута под названием SortMemberPath. Надеюсь, поможет!! 06.10.2010
  • Отличный ответ Гуру! Спасибо за помощь! Я добавлю, что, указав SortMemberPath = CustID (например) в DataGridTemplateColumn, я смог удалить атрибут Sorting в DataGrid и удалить свою собственную реализацию IComparer. Я твой ответ помогает другим. Если у кого-то есть вопросы по решению, постараюсь им помочь. 06.10.2010
  • Спасибо! Сэкономил мне много времени. Мне нужно реализовать CellTemplates для строк, в которых мне нужно обернуть текст, и я действительно думал, что вы не можете отсортировать эти столбцы, но теперь я знаю, что вы можете! 12.04.2012
  • У меня аналогичная проблема, но мой DataGrid прекратил сортировку, когда я заменил базовую коллекцию на BindingList ‹T›. 09.07.2013

  • 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>
    
    24.10.2013
  • Чем ваш ответ отличается от принятого? Значение SortMemberPath должно называть столбец источника данных. Завершить не входит в число моих столбцов участников. 25.10.2013
  • Я не видел приведенного выше ответа, возможно, он написал, когда я редактировал свой. Что касается имени заголовка, я попробовал это мой тест wpf, если он работает, вам нужно просто изменить имя заголовка. 25.10.2013
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..