Arhn - архитектура программирования

Изменение порядка столбцов сетки данных WPF

Я хотел бы дать пользователю настройки, в которых он может изменить порядок столбцов datagrid. Я знаю, что могу использовать DisplayIndex для достижения этого, но моя проблема в том, как я могу сохранить порядок каждого столбца, как я могу узнать, какой столбец был перемещен в первую позицию и так далее?

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

ниже приведена сетка данных, которую я использую:

<DataGrid GridLinesVisibility="All" VerticalGridLinesBrush="#FFE5E2DB" IsReadOnly="true" AutoGenerateColumns="False" VerticalContentAlignment="Center" 
                      ItemsSource="{Binding DisplayIndexes, UpdateSourceTrigger=PropertyChanged}" CanUserSortColumns="True" SelectionUnit="FullRow" 
                      HorizontalAlignment="Stretch" Margin="5,5,5,0" Name="dgDisplayIndexes"  
                      TabIndex="1" RowHeight="30" 
                      CanUserAddRows="False" HorizontalScrollBarVisibility="Hidden" VerticalScrollBarVisibility="Hidden" ColumnWidth="Auto" CanUserReorderColumns="True" 
                      CanUserResizeColumns="False" CanUserResizeRows="False" VerticalAlignment="Top" Height="150">
                <DataGrid.RowStyle>
                    <Style TargetType="{x:Type DataGridRow}">
                        <Setter Property="Padding" Value="0"/>
                        <Setter Property="Margin" Value="0"/>
                        <Setter Property="VerticalAlignment" Value="Center"/>
                    </Style>
                </DataGrid.RowStyle>
                <DataGrid.Columns>
                    <DataGridTextColumn Header="ID" Binding="{Binding ID}" DisplayIndex="0" Visibility="Hidden" />
                    <DataGridTemplateColumn SortMemberPath="status"  
                                        Header="{Binding Vertaling.DELIVERY_BEZORGORDER_LOPENDEORDERSTAB_DG_STATUS.Vertaling, Source={x:Static Application.Current}, NotifyOnSourceUpdated=True}" 
                                        DisplayIndex="1" >
                        <DataGridTemplateColumn.CellTemplate>
                            <DataTemplate>
                                <Image Height="16" Width="16" Stretch="Fill" Source="{Binding status, Converter={StaticResource getIconForStatus}}" />
                            </DataTemplate>
                        </DataGridTemplateColumn.CellTemplate>
                    </DataGridTemplateColumn>
                    <DataGridTextColumn 
                    Header="#" 
                    Binding="{Binding bonnummer}"  
                    DisplayIndex="2" />
                    <DataGridTextColumn 
                    Header="{Binding Vertaling.DELIVERY_BEZORGORDER_LOPENDEORDERSTAB_DG_NAAM.Vertaling, Source={x:Static Application.Current}, NotifyOnSourceUpdated=True}" 
                    Binding="{Binding achternaam}" 
                    DisplayIndex="3" />
                    <DataGridTextColumn 
                    Header="{Binding Vertaling.DELIVERY_BEZORGORDER_LOPENDEORDERSTAB_DG_ADRES.Vertaling, Source={x:Static Application.Current}, NotifyOnSourceUpdated=True}" 
                    Binding="{Binding Adres}" 
                    DisplayIndex="4" />
                    <DataGridTextColumn 
                    Header="{Binding Vertaling.DELIVERY_BEZORGORDER_LOPENDEORDERSTAB_DG_PC.Vertaling, Source={x:Static Application.Current}, NotifyOnSourceUpdated=True}" 
                    Binding="{Binding Postcode}" 
                    DisplayIndex="5" />
                    <DataGridTextColumn 
                    Header="{Binding Vertaling.DELIVERY_BEZORGORDER_LOPENDEORDERSTAB_DG_PLAATS.Vertaling, Source={x:Static Application.Current}, NotifyOnSourceUpdated=True}" 
                    Binding="{Binding plaats}" 
                    DisplayIndex="6"/>
                    <DataGridTextColumn 
                    Header="{Binding Vertaling.DELIVERY_BEZORGORDER_LOPENDEORDERSTAB_DG_TELEFOON.Vertaling, Source={x:Static Application.Current}, NotifyOnSourceUpdated=True}" 
                    Binding="{Binding telefoonnummer}" 
                    DisplayIndex="7" />
                    <DataGridTextColumn 
                    Header="{Binding Vertaling.DELIVERY_BEZORGORDER_LOPENDEORDERSTAB_DG_AANTALBESTELLINGEN.Vertaling, Source={x:Static Application.Current}, NotifyOnSourceUpdated=True}" 
                    Binding="{Binding AantalBestellingen}" 
                    DisplayIndex="8" />
                    <DataGridTextColumn 
                    Header="{Binding Vertaling.DELIVERY_BEZORGORDER_LOPENDEORDERSTAB_DG_KAARTCOORDINATEN.Vertaling, Source={x:Static Application.Current}, NotifyOnSourceUpdated=True}" 
                    Binding="{Binding Coordinaten}" 
                    DisplayIndex="9" />
                    <DataGridTextColumn 
                    Header="{Binding Vertaling.DELIVERY_BEZORGORDER_LOPENDEORDERSTAB_DG_GEBIED.Vertaling, Source={x:Static Application.Current}, NotifyOnSourceUpdated=True}" 
                    Binding="{Binding bezorggebied}" 
                    DisplayIndex="10" />
                    <DataGridTextColumn 
                    Header="{Binding Vertaling.DELIVERY_BEZORGORDER_LOPENDEORDERSTAB_DG_KM.Vertaling, Source={x:Static Application.Current}, NotifyOnSourceUpdated=True}" 
                    Binding="{Binding afstand, StringFormat='{}{0:N2}'}" 
                    DisplayIndex="11" />
                    <DataGridTextColumn 
                    Header="{Binding Vertaling.DELIVERY_BEZORGORDER_LOPENDEORDERSTAB_DG_REISTIJD.Vertaling, Source={x:Static Application.Current}, NotifyOnSourceUpdated=True}" 
                    Binding="{Binding reistijd}" 
                    DisplayIndex="12" />
                    <DataGridTextColumn 
                    Header="{Binding Vertaling.DELIVERY_BEZORGORDER_LOPENDEORDERSTAB_DG_TIJD.Vertaling, Source={x:Static Application.Current}, NotifyOnSourceUpdated=True}" 
                    Binding="{Binding tijd, StringFormat={}{0:HH:mm}}" 
                    DisplayIndex="13" />
                    <DataGridTextColumn 
                    Header="{Binding Vertaling.DELIVERY_BEZORGORDER_LOPENDEORDERSTAB_DG_OUD.Vertaling, Source={x:Static Application.Current}, NotifyOnSourceUpdated=True}" 
                    Binding="{Binding oud}" 
                    DisplayIndex="14" />
                    <DataGridTextColumn 
                    Header="{Binding Vertaling.DELIVERY_BEZORGORDER_LOPENDEORDERSTAB_DG_BEZORGTIJD.Vertaling, Source={x:Static Application.Current}, NotifyOnSourceUpdated=True}" 
                    Binding="{Binding gereed_om, StringFormat={}{0:HH:mm}}" 
                    DisplayIndex="15" />
                    <DataGridTextColumn     
                    Header="{Binding Vertaling.DELIVERY_BEZORGORDER_LOPENDEORDERSTAB_DG_BEZORGER.Vertaling, Source={x:Static Application.Current}, NotifyOnSourceUpdated=True}" 
                    Binding="{Binding bezorger}" 
                    DisplayIndex="16" />
                    <DataGridTextColumn 
                    Header="{Binding Vertaling.DELIVERY_BEZORGORDER_LOPENDEORDERSTAB_DG_VERTROKKEN.Vertaling, Source={x:Static Application.Current}, NotifyOnSourceUpdated=True}" 
                    Binding="{Binding bezorger_vertrokken_om, StringFormat={}{0:HH:mm}}" 
                    DisplayIndex="17" />
                    <DataGridTextColumn 
                    Header="{Binding Vertaling.DELIVERY_BEZORGORDER_LOPENDEORDERSTAB_DG_OVER.Vertaling, Source={x:Static Application.Current}, NotifyOnSourceUpdated=True}" 
                    Binding="{Binding bezorgerterugover}" 
                    DisplayIndex="18" />
                    <DataGridTextColumn 
                    Header="{Binding Vertaling.DELIVERY_BEZORGORDER_LOPENDEORDERSTAB_DG_TERUG.Vertaling, Source={x:Static Application.Current}, NotifyOnSourceUpdated=True}" 
                    Binding="{Binding bezorgerterug, StringFormat={}{0:HH:mm}}" 
                    DisplayIndex="19" />
                    <DataGridTextColumn 
                    Header="{Binding Vertaling.DELIVERY_BEZORGORDER_LOPENDEORDERSTAB_DG_KEUKEN.Vertaling, Source={x:Static Application.Current}, NotifyOnSourceUpdated=True}" 
                    Binding="{Binding keuken}" 
                    DisplayIndex="20" />
                    <DataGridTextColumn 
                    Header="{Binding Vertaling.DELIVERY_BEZORGORDER_LOPENDEORDERSTAB_DG_TELAATBERICHTUITOM.Vertaling, Source={x:Static Application.Current}, NotifyOnSourceUpdated=True}" 
                    Binding="{Binding TeLaatBerichtTijd, StringFormat={}{0:HH:mm}}" 
                    DisplayIndex="21" />
                </DataGrid.Columns>
            </DataGrid>
06.08.2014

Ответы:


1

Вы можете привязать свойство DataGrid DisplayIndex к свойству в вашей ViewModel:

...
<DataGridTextColumn 
                    Header="#" 
                    Binding="{Binding bonnummer}"  
                    DisplayIndex="{Binding BonnummerIndex, Mode=TwoWay, FallbackValue=2}" ... />
...

BonnummerIndex — это ваше свойство ViewModel, в котором хранится позиция отображения столбца. Вы также можете привязаться к элементу массива, т.е. DisplayIndex="{Binding ColumnsOrder[2], Mode=TwoWay, FallbackValue=2}". FallbackValue устанавливается в положение столбца по умолчанию. Это нужно, чтобы избежать значения DisplayIndex по умолчанию (-1), которое, в свою очередь, выдает исключение вне диапазона. Привязка TwoWay необходима для отражения пользовательских изменений во ViewModel.

Позже вы можете сериализовать/десериализовать класс, чтобы сохранить пользовательские настройки.

Вам просто нужно быть осторожным, потому что изменение DisplayIndex одного столбца может изменить DisplayIndex (ы) других столбцов.

06.08.2014
  • Спасибо за ответ, но эту часть я уже знал, как это сделать, привязывая displayIndex к свойству в моей модели представления и устанавливая значение Fallback для предотвращения исключений. Мой вопрос больше касается настроек, где я позволяю пользователю изменять положение столбцов, поэтому, когда он загружает пользовательский элемент управления с помощью этой сетки данных, столбцы останутся на том месте, где он их установил. Я сомневаюсь, как я буду например, отслеживать, какой столбец находится в позиции 0, а какой — в позиции 2. Надеюсь, теперь вы понимаете мой вопрос. 06.08.2014
  • Если вы привяжете DisplayIndex к свойству в ViewModel, то привязки будут автоматически обновлять ViewMonel, когда пользователь изменит последовательность столбцов (перетащите столбцы). Чтобы сохранить данные, вы можете сериализовать объект, в котором хранятся DisplayIndexes, на диск и десериализовать с диска при загрузке приложения/управления. 06.08.2014
  • Спасибо, я смог решить проблему, создав новый класс и сохранив индекс каждого столбца, который позже вызывает пользовательский элемент управления с сеткой данных. 08.08.2014
  • Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..