0

所以我正在尝试学习 wpf 并将 ac# .net 表单项目重新编码为 wpf。同时我正在尝试解决我在表单项目中遇到的问题。其中之一是列未正确排序。有一列是“文件名”主列的字母数字列。我找到了一个我认为可以使用DataGrid CustomSorting的包, 但在用例中它会出错,我不知道它是否是由我如何绑定到 datagrid 或什么引起的。该项目没有太多文档。

出错的代码行

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());
                }

            }
        }

xml 数据网格

<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>

任何助手都非常感谢 我尝试设置自定义排序的原因

4

1 回答 1

0

如果您想要完全控制的自定义排序没有任何未来错误,我建议只绑定数据模型而不是视图源,尝试从 .xaml 中删除所有数据源和资源到视图模型,为 GettingSortedData() 创建自定义函数,LoadingSortedDataInDatagrid() 与事件处理程序

于 2019-10-10T07:27:40.690 回答