C# WPF DataGrid:自动对DataGridTemplateColumn重新排序

C# WPF DataGrid:自动对DataGridTemplateColumn重新排序,c#,wpf,datagrid,datagridtemplatecolumn,C#,Wpf,Datagrid,Datagridtemplatecolumn,在WPF的DataGrid控件中,如果将列设置为默认列类型之一(如DataGridTextColumn或DataGridCheckBoxColumn),则对该列进行排序,然后更改其值,网格将自动重新排序 但是,如果使用DataGridTemplateColumn(并允许对该列进行排序),则可以对其进行排序,但更改该列中单元格的值不会导致网格未重新排序如何诱使其自动触发重新排序? XAML: 这是我的项目类,以防万一: public class Character : INotifyPropert

在WPF的DataGrid控件中,如果将列设置为默认列类型之一(如DataGridTextColumn或DataGridCheckBoxColumn),则对该列进行排序,然后更改其值,网格将自动重新排序

但是,如果使用DataGridTemplateColumn(并允许对该列进行排序),则可以对其进行排序,但更改该列中单元格的值不会导致网格未重新排序如何诱使其自动触发重新排序?

XAML:

这是我的项目类,以防万一:

public class Character : INotifyPropertyChanged {
    private string first, last;
    public event PropertyChangedEventHandler PropertyChanged;
    private void Notify(string name) {
        if (PropertyChanged != null)
            PropertyChanged(this, new PropertyChangedEventArgs(name));
    }
    public string First { get { return first; } set { first = value; Notify("First"); } }
    public string Last { get { return last; } set { last = value; Notify("Last"); } }
}

我也在寻找答案。我找到了一个解决办法:(不满意,但…)

更新收藏后,您可以执行以下操作:

SortDescription sortDescription = grdData.Items.SortDescriptions[0];
grdData.ItemsSource = null;
grdData.ItemsSource = Data;
grdData.Items.SortDescriptions.Add(sortDescription);
很难看,但确实有用。您将希望存储整个集合,而我的示例只存储第一项

但是,它的一个问题是DataGrid松开了指示排序的标题,因此尽管它正确地调用了列标题,但不再选择显示排序方向的箭头。

我在VS2010下的C#WPF中有一个DataGrid,无论XAML设置如何,它都不会排序。出于某种原因,此隐藏的DataGrid(位于辅助选项卡上)在排序顺序方面存在问题,而主DataGrid在类似设置下没有问题。因此,我必须以图表的方式对数据网格进行排序。以下是我的笔记:

首先是两个数据网格(主要和次要)的XAML,我们将只对第二个“扩展名称”网格进行排序:


希望这能帮助其他人通过代码对其数据网格进行排序。我们发现的大多数其他示例对于简单的设置都很有效,但在这个双数据网格选项卡式设置中,排序出现了问题。

在将新行插入数据网格时,我遇到了类似的问题。 我通过刷新DataGrid的项解决了这个问题

dataGrid.Items.Refresh()。这还会恢复排序。
不要忘记在DataGridColumn(在本例中是DataGridTextColumn)处设置SortDirection

数据网格定义:

<DataGrid x:Name="dgCustomers" ItemsSource="{Binding CustomerTable}" AutoGenerateColumns="False" CanUserDeleteRows="True">
        <DataGrid.Columns>
            <DataGridTextColumn Header="Kunden ID" Binding="{Binding Path=KundenID,Mode=TwoWay}" SortDirection="Ascending" />
            <DataGridTextColumn Header="Name" Binding="{Binding Path=Kundenname,Mode=TwoWay}"/>
    </DataGrid.Columns>
</DataGrid>

我知道这很旧,但我也遇到了DataGridTemplateColumn重新排序问题。DataGridTextColumn上不会出现这种情况。我用列标题上完整的排序方向来解决它的方法是:

// after updating the collection, remove all SortDescription and add'em back.
SortDescriptionCollection sortDescriptions = new SortDescriptionCollection();
foreach (SortDescription sd in dataGrid.Items.SortDescriptions)
{
    sortDescriptions.Add(sd);
}
dataGrid.Items.SortDescriptions.Clear();

foreach (SortDescription sd in sortDescriptions)
{
    dataGrid.Items.SortDescriptions.Add(sd);
}

希望这能帮助人们。

2016年,这些答案中没有一个对我有用

经过一些尝试和错误,我想出了这个,它似乎工作得很好:

dataGrid.Items.IsLiveSorting = true;

对我来说似乎很好。你的意思是更改DataGridTemplateColumn的SortMemberPath值吗?当你显式单击它时,它会排序,或者当你更改FirstName column的值时,它会排序,但当你更改LastName列的值时,它不会重新排序。设置SortMemberPath允许它排序,但不会使它自动排序在这种情况下,我观察到一个必要属性的更改,并调用了SomeCollectionViewOfGrid.Refresh();我建议您在代码的前言中添加一点叙述,以解释您正在做什么以及为什么要为一个两年前的问题添加此答案。无需重置
项资源
。在我的应用程序中
SortDescriptions.Clear();
反而可以完美地工作。
        if (!extendSorted)
        {
            SortDescription extSort = new SortDescription("Name", ListSortDirection.Ascending);
            grdExtendedNames.Items.SortDescriptions.Add(extSort);
            extendSorted = true;
        }
<DataGrid x:Name="dgCustomers" ItemsSource="{Binding CustomerTable}" AutoGenerateColumns="False" CanUserDeleteRows="True">
        <DataGrid.Columns>
            <DataGridTextColumn Header="Kunden ID" Binding="{Binding Path=KundenID,Mode=TwoWay}" SortDirection="Ascending" />
            <DataGridTextColumn Header="Name" Binding="{Binding Path=Kundenname,Mode=TwoWay}"/>
    </DataGrid.Columns>
</DataGrid>
private void btnSavecustomerChanges_Click(object sender, RoutedEventArgs e)
{        
    try        
    {
        BL.UpdateCustomerChanges();
        dgCustomers.Items.Refresh();
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message, "Fehler beim Speichern", MessageBoxButton.OK, MessageBoxImage.Error);
    }
}
    If DataGridMain.Items.SortDescriptions.Count > 0 Then
        Dim vSortDescColl As New SortDescriptionCollection
        For Each vSortDesc In DataGridMain.Items.SortDescriptions
            vSortDescColl.Add(vSortDesc)
        Next
        DataGridMain.ItemsSource = Nothing
        DataGridMain.ItemsSource = vCallColl
        For Each vSortDesc In vSortDescColl
            DataGridMain.Items.SortDescriptions.Add(vSortDesc)
            For Each vColumn In DataGridMain.Columns
                If vColumn.SortMemberPath = vSortDesc.PropertyName Then
                    vColumn.SortDirection = vSortDesc.Direction
                    Exit For
                End If
            Next
        Next
    End If
// after updating the collection, remove all SortDescription and add'em back.
SortDescriptionCollection sortDescriptions = new SortDescriptionCollection();
foreach (SortDescription sd in dataGrid.Items.SortDescriptions)
{
    sortDescriptions.Add(sd);
}
dataGrid.Items.SortDescriptions.Clear();

foreach (SortDescription sd in sortDescriptions)
{
    dataGrid.Items.SortDescriptions.Add(sd);
}
dataGrid.Items.IsLiveSorting = true;