таможенная сортировка таблицы данных BindingListCollectionView для ввода ошибки ListCollectionView - PullRequest
0 голосов
/ 09 октября 2019

Так что я пытаюсь выучить wpf и перекодировать ac # .net формы проекта в wpf. в то же время я пытаюсь исправить проблемы, которые у меня были с проектом форм. одним из которых является неправильная сортировка столбцов. есть столбец, который является буквенно-цифровым для основного столбца «filenames». я нашел пакет, который, как я думал, будет работать DataGrid CustomSorting , но в случае использования он выдает ошибку, и я не знаю, вызвано ли это тем, как я связываюсь с сеткой данных или чем-то другим. проект не имеет много документации.

строка кода с ошибкой

var listCollectionView = (ListCollectionView)CollectionViewSource.GetDefaultView(dataGrid.ItemsSource);

ошибка

'Unable to cast object of type 'System.Windows.Data.BindingListCollectionView' to type 'System.Windows.Data.ListCollectionView'.'

Полный блок кода

private static void HandleCustomSorting(object sender, DataGridSortingEventArgs e)
        {
            var dataGrid = (DataGrid)sender;

            if (!GetUseCustomSort(dataGrid))
            {
                return;
            }

            if (string.IsNullOrEmpty(e.Column.SortMemberPath))
            {
                return;
            }

            var listCollectionView = (ListCollectionView)CollectionViewSource.GetDefaultView(dataGrid.ItemsSource);
            IComparer sorter = GetCustomSorter(e.Column);

            if (sorter == null)
            {
                return;
            }

            listCollectionView.CustomSort = new ColumnComparer(sorter, e.Column);

            e.Handled = true;
        }

загрузка таблицы данных

private void PricingActiveCatagory_SelectedIndexChanged(object sender, EventArgs e)
        {
            string Dir1 = string.Format("{0}/Displays/{1}/{2}", SV.appPath, PricingActiveDisplay.SelectedValue.ToString(), PricingActiveCatagory.SelectedItem.ToString());
            string[] fileList1 = Directory.GetFiles(Dir1);
            if (fileList1.Length > 0)
            {
                var conn = new SQLiteConnection(string.Format("data source ={0}/database/{1}.sqlite;Version=3;New=True;Compress=True;", SV.appPath, PricingActiveDisplay.SelectedValue.ToString()));
                dt.Clear();
                dt.Columns.Clear();
                dt = new DataTable();
                try
                {
                    SQLiteCommandBuilder builder = new SQLiteCommandBuilder(da);
                    using (conn)
                    {
                        conn.Open();
                        dt.Rows.Clear();
                        if (Sqlite.TableExists(PricingActiveCatagory.SelectedItem.ToString(), conn))
                        {
                            var sql = ("SELECT * FROM \"" + PricingActiveCatagory.SelectedItem.ToString() + "\"");
                            using (SQLiteCommand cmdDataGrid = new SQLiteCommand(sql, conn))
                            {
                                da.SelectCommand = cmdDataGrid;
                                da.Fill(dt);
                                Pricing_view.DataContext = dt.DefaultView;
                            }
                        }
                    }
                }
                catch (Exception ex)
                {
                    System.Windows.Forms.MessageBox.Show(ex.ToString());
                }

            }
        }

xaml datagrid

<DataGrid Grid.Row="1" Name="Pricing_view" AutoGenerateColumns="false" local:DataGridHelpers.UseCustomSort="True" ItemsSource="{Binding}"  >
                                    <DataGrid.Columns>
                                        <DataGridTextColumn  Binding="{Binding Filename}"  Header="File Name" SortDirection="Ascending" local:DataGridHelpers.CustomSorterType="{x:Type local:StrLogicalComparer}">
                                            <DataGridTextColumn.ElementStyle>
                                                <Style TargetType="TextBlock">
                                                    <Setter Property="HorizontalAlignment" Value="Center" />
                                                </Style>
                                            </DataGridTextColumn.ElementStyle>
                                        </DataGridTextColumn>
                                        <DataGridTextColumn  Binding="{Binding FileTimeStamp}"  Header="File Time Stamp"/>
                                        <DataGridTextColumn  Binding="{Binding dir}" Header="image Dir"/>
                                        <DataGridTextColumn  Binding="{Binding upc}"  Header="Upc Dir"/>
                                        <DataGridTextColumn  Binding="{Binding price}"  Header="Price"/>
                                    </DataGrid.Columns>
                                </DataGrid>

Любые помощники высоко ценятся причина, по которой я пытаюсь настроить пользовательскую сортировку

1 Ответ

0 голосов
/ 10 октября 2019

Если вам нужна пользовательская сортировка с полным контролем без каких-либо ошибок в будущем, я предлагаю просто связать модель данных, но не источник просмотра, попробуйте удалить все источники данных и ресурсы для просмотра модели из .xaml, создать пользовательскую функцию для GettingSortedData (), LoadingSortedDataInDatagrid () с обработчиком событий

...