C# 从xaml对wpf datagrid中的列标题进行排序

C# 从xaml对wpf datagrid中的列标题进行排序,c#,sql,wpf,xaml,datagrid,C#,Sql,Wpf,Xaml,Datagrid,我有我的xaml数据网格: public DataTable Data { get { return _tableData; } set { if (Equals(value, _tableData)) return; _tableData = value; NotifyOfPropertyChange(); } } 没有帮助,出现了一个数组。它尝试在列标题字符串中查找此属性 IValue converter

我有我的xaml数据网格:

public DataTable Data
{
    get { return _tableData; }
    set
    {
        if (Equals(value, _tableData)) return;
        _tableData = value;
        NotifyOfPropertyChange();
    }   
}
没有帮助,出现了一个数组。它尝试在列标题字符串中查找此属性

  • IValue converter,帮助我进行treeview排序:

  • 由于您正在自动生成列,我认为最好的方法是使用

    我想出了以下代码--仔细,未经充分测试----按字母顺序重新排列列:

    XAML

    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
       System.Collections.IList collection = value as System.Collections.IList;
       ListCollectionView view = new ListCollectionView(collection);
       SortDescription sort = new SortDescription(parameter.ToString(), ListSortDirection.Ascending);
       view.SortDescriptions.Add(sort);
    
       return view;
    }
    
    
    
    代码隐藏

    <DataGrid ItemsSource="{Binding Data}"
              AutoGenerateColumns="True"
              AutoGeneratingColumn="dg_AutoGeneratingColumn" />
    
    公共类数据项
    {
    公共字符串名称{get;set;}
    公共字符串Ask{get;set;}
    公共字符串日期{get;set;}
    公共字符串Zulu{get;set;}
    公共数据项(字符串n、字符串a、字符串d、字符串z)
    {
    Name=n;
    Ask=a;
    日期=d;
    Zulu=z;
    }
    }
    公共部分类主窗口:窗口
    {
    ObservableCollection数据=新的ObservableCollection();
    公共可观测收集数据
    {
    得到
    {
    返回数据;
    }
    }
    公共主窗口()
    {
    添加(新数据项(“A”、“No”、“07/14”和“?”));
    添加(新的数据项(“B”、“是”、“07/14”和“!”));
    添加(新数据项(“C”、“Tes”、“07/14”和“*”));
    数据。添加(新数据项(“D”、“No”、“07/14”和“%”);
    初始化组件();
    this.DataContext=this;
    }
    私有void dg_AutoGeneratingColumn(对象发送方,DataGridAutoGeneratingColumnEventArgs e)
    {
    DataGrid dg=发送方作为DataGrid;
    如果(dg!=null&&e!=null)
    {
    DataGridColumn currentColumn=e.列;
    如果(currentColumn!=null)
    {
    字符串currentHeader=currentColumn.Header.ToString();
    int currentIndex=0;
    //按名称对列进行排序,以便将新列添加到正确的索引中
    foreach(DataGridColumn-dgc-in(dg.Columns.OrderBy(col=>col.Header.ToString()))
    {
    if(currentHeader.CompareTo(dgc.Header.ToString())<0)
    {
    //设置当前列
    currentColumn.DisplayIndex=当前索引;
    //短路循环,这样我们就不会在已经完成后继续比较了
    //找到了放置当前列的正确索引
    打破
    }
    currentIndex++;
    }
    }
    }
    }
    }
    
    不使用dg_自动生成列的输出:

    使用
    dg_自动生成列进行输出


    如果有人对我是如何做到的感兴趣:

    public class DataItem
    {
        public string Name { get; set; }
        public string Ask { get; set; }
        public string Date { get; set; }
        public string Zulu { get; set; }
        public DataItem(string n, string a, string d, string z)
        {
            Name = n;
            Ask = a;
            Date = d;
            Zulu = z;
        }
    }
    
    public partial class MainWindow : Window
    {
        ObservableCollection<DataItem> data = new ObservableCollection<DataItem>();
        public ObservableCollection<DataItem> Data
        {
            get
            {
                return data;
            }
        }
        public MainWindow()
        {
            Data.Add(new DataItem("A", "No", "07/14", "?"));
            Data.Add(new DataItem("B", "Yes", "07/14", "!"));
            Data.Add(new DataItem("C", "Tes", "07/14", "*"));
            Data.Add(new DataItem("D", "No", "07/14", "%"));
            InitializeComponent();
            this.DataContext = this;
        }
    
        private void dg_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
        {
            DataGrid dg = sender as DataGrid;
            if (dg != null && e != null)
            {
                DataGridColumn currentColumn = e.Column;
                if (currentColumn != null)
                {
                    string currentHeader = currentColumn.Header.ToString();
    
                    int currentIndex = 0;
    
                    // Sort the Columns by name so we add the new column to the correct index
                    foreach (DataGridColumn dgc in (dg.Columns.OrderBy(col => col.Header.ToString())))
                    {
                        if (currentHeader.CompareTo(dgc.Header.ToString()) < 0)
                        {
                            // set the current columns
                            currentColumn.DisplayIndex = currentIndex;
    
                            // short-circuit the loop so we don't keep comparing after we already
                            // found the correct index to place the current column
                            break;
                        }
    
                        currentIndex++;
                    }
                }
            }
        }
    }
    
    此代码的作用是:

    首先,我从datatable中获取列名,然后按需要的顺序对它们进行排序。 接下来,我在列上使用内置的
    SetOrdinal
    方法,将其置于正确的位置

    <DataGrid ItemsSource="{Binding Data}"
              AutoGenerateColumns="True"
              AutoGeneratingColumn="dg_AutoGeneratingColumn" />
    
    public class DataItem
    {
        public string Name { get; set; }
        public string Ask { get; set; }
        public string Date { get; set; }
        public string Zulu { get; set; }
        public DataItem(string n, string a, string d, string z)
        {
            Name = n;
            Ask = a;
            Date = d;
            Zulu = z;
        }
    }
    
    public partial class MainWindow : Window
    {
        ObservableCollection<DataItem> data = new ObservableCollection<DataItem>();
        public ObservableCollection<DataItem> Data
        {
            get
            {
                return data;
            }
        }
        public MainWindow()
        {
            Data.Add(new DataItem("A", "No", "07/14", "?"));
            Data.Add(new DataItem("B", "Yes", "07/14", "!"));
            Data.Add(new DataItem("C", "Tes", "07/14", "*"));
            Data.Add(new DataItem("D", "No", "07/14", "%"));
            InitializeComponent();
            this.DataContext = this;
        }
    
        private void dg_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
        {
            DataGrid dg = sender as DataGrid;
            if (dg != null && e != null)
            {
                DataGridColumn currentColumn = e.Column;
                if (currentColumn != null)
                {
                    string currentHeader = currentColumn.Header.ToString();
    
                    int currentIndex = 0;
    
                    // Sort the Columns by name so we add the new column to the correct index
                    foreach (DataGridColumn dgc in (dg.Columns.OrderBy(col => col.Header.ToString())))
                    {
                        if (currentHeader.CompareTo(dgc.Header.ToString()) < 0)
                        {
                            // set the current columns
                            currentColumn.DisplayIndex = currentIndex;
    
                            // short-circuit the loop so we don't keep comparing after we already
                            // found the correct index to place the current column
                            break;
                        }
    
                        currentIndex++;
                    }
                }
            }
        }
    }
    
    <DataGrid
      HorizontalAlignment="Stretch" 
      IsReadOnly="True"
      IsReadOnly="True" ItemsSource="{Binding Data, Converter={StaticResource DataGridSortingConverter}}" 
      AutoGenerateColumns="True">
    </DataGrid>
    
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
            {
                if (value == null)
                    return null;
    
                var dataTable = value as DataTable;
    
                if (dataTable != null)
                {
                    var columnsList = (from object column in dataTable.Columns select column.ToString()).ToList();
    
                    columnsList = columnsList.OrderBy(col => col).ToList();
    
                    for (var i = 0; i < columnsList.Count; i++)
                    {
                        dataTable.Columns[columnsList[i]].SetOrdinal(i);
                    }
    
                    return dataTable;
                }
    
                return value;
            }