XAML 以编程方式对wpf数据网格进行排序

70gysomp  于 12个月前  发布在  其他
关注(0)|答案(7)|浏览(104)

有没有一种方法可以通过编程方式对WPF DataGrid进行排序(例如,如果我单击了第一列)?
有没有办法模拟这种点击?

我的代码如下:

Collection_Evenements = new ObservableCollection<Evenement>();
 
Collection_Evenements = myEvenement.GetEvenementsForCliCode(App.obj_myClient.m_strCode);
Collection_Evenements.CollectionChanged += Collection_Evenements_CollectionChanged;
myDataGridEvenements.ItemsSource = Collection_Evenements;
 
System.Data.DataView dv = (System.Data.DataView)myDataGridEvenements.ItemsSource;
dv.Sort = "strEvtType";
            
myDataGridEvenements.Focus();
myDataGridEvenements.SelectedIndex = 0;
myDataGridEvenements.MoveFocus(new TraversalRequest(FocusNavigationDirection.Next));

我不知道为什么,但是dv.Sort = "strEvtType";行导致了一件奇怪的事情,我的窗口出现了,程序没有继续执行下一行,尽管如此,我没有看到排序!

uurv41yg

uurv41yg1#

voo的解决方案对我不起作用,ItemsSource是null,很可能是因为它不是直接设置的,而是绑定的。我在StackOverflow找到的所有其他解决方案都只处理Model的排序,但是DataGrid头并没有反映到排序中。
这里有一个基于不完整脚本的正确解决方案:http://dotnetgui.blogspot.co.uk/2011/02/how-to-properly-sort-on-wpf-datagrid.html

public static void SortDataGrid(DataGrid dataGrid, int columnIndex = 0, ListSortDirection sortDirection = ListSortDirection.Ascending)
{
    var column = dataGrid.Columns[columnIndex];

    // Clear current sort descriptions
    dataGrid.Items.SortDescriptions.Clear();

    // Add the new sort description
    dataGrid.Items.SortDescriptions.Add(new SortDescription(column.SortMemberPath, sortDirection));

    // Apply sort
    foreach (var col in dataGrid.Columns)
    {
        col.SortDirection = null;
    }
    column.SortDirection = sortDirection;

    // Refresh items to display sort
    dataGrid.Items.Refresh();
}

对于你的代码,可以这样使用:

SortDataGrid(myDataGridEvenements, 0, ListSortDirection.Ascending);

或者使用默认参数值,只需:

SortDataGrid(myDataGridEvenements);
w9apscun

w9apscun2#

获取ItemsSource的DataView并使用其Sort属性指定排序依据的列:

(yourDataGrid.ItemsSource as DataView).Sort = "NAME_OF_COLUMN";
8fq7wneg

8fq7wneg3#

DataGrid的PerformSort方法是在列标题单击时实际执行的。但这种方法是内部的。因此,如果你真的想模拟点击,你需要使用反射:

public static void SortColumn(DataGrid dataGrid, int columnIndex)
{
    var performSortMethod = typeof(DataGrid)
                            .GetMethod("PerformSort",
                                       BindingFlags.Instance | BindingFlags.NonPublic);

    performSortMethod?.Invoke(dataGrid, new[] { dataGrid.Columns[columnIndex] });
}
nue99wik

nue99wik4#

快速&简单的方法:

dgv.Items.SortDescriptions.Clear();
dgv.Items.SortDescriptions.Add(new SortDescription("ID", ListSortDirection.Descending));
dgv.Items.Refresh();
oxiaedzo

oxiaedzo5#

这个方法对我很有效:

if (dgEvents.ItemsSource == null)
    dgEvents.ItemsSource = events.Entries;

CollectionViewSource.GetDefaultView(dgEvents.ItemsSource).Refresh();

dgEvents.Items.SortDescriptions.Clear();

dgEvents.Items.SortDescriptions.Add(
    new SortDescription(dgEvents.Columns[0].SortMemberPath,
    ListSortDirection.Descending));
                
foreach (var col in dgEvents.Columns)
{
    col.SortDirection = null;
}

dgEvents.Columns[0].SortDirection = ListSortDirection.Descending;

dgEvents.Items.Refresh();
eiee3dmh

eiee3dmh6#

你可以使用ICollectionView来过滤,排序和分组你的数据网格中的项目。
编辑:添加排序,没有仔细阅读问题:)

var view = CollectionViewSource.GetDefaultView(this.MyData);
 view.Filter = ViewFilter;
 view.SortDescriptions.Add(new SortDescription("MyPropertyToSort", ListSortDirection.Descending));

    private bool ViewFilter(object obj)
    {
        var item = obj as MyObject;

        if (item == null)
            return false;

        //your filter logik goes here

        if(item.MyStringProp.StartsWith("Test"))
            return false;

        return true;

   }
6qqygrtg

6qqygrtg7#

要像单击第一列那样对DataGrid进行排序,必须使用从WPF创建的DataView。在本例中,DataGrid在每次自动生成列时进行排序,但您可以选择其他事件,如DataGrid1_Loaded

using System.Windows.Data;

private void DataGrid1_AutoGeneratedColumns(object sender, EventArgs e)
    {
        (((DataGrid)sender).ItemsSource as DataView).Sort = DataGrid1.Columns[0].Header.ToString();
    }

相关问题